Javascript Windows Logoff - logoff.exe

Я разрабатываю файл HTA, и я пытаюсь создать ссылку, по которой пользователь будет отключен при нажатии.

Моя функция:

function fn_fecha()
{
WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("C:\\Windows\\System32\\logoff.exe");
}

и вызов:

<tr>
<td WIDTH=300>
</td>            
<td>
<a id=hsair href="#" onclick="javascript:fn_fecha"  >SAIR</a>
</td>               
</tr>

Я пробовал как функцию только с одним "\" (c:\windows\system32\logoff.exe), так и функцию с fn_fecha(), но он не находит файл, когда я делаю это. Файл HTA размещен на сервере (но не открывается через IIS).

2 ответа

Решение

В Windows 7 x64 вы можете найти папку "C:\Windows\SysWOW64", которая содержит некоторые 32-битные приложения и библиотеки для создания 32-битной совместимой среды.

(См. Также: Почему 64-разрядные библиотеки DLL попадают в System32, а 32-разрядные библиотеки DLL - в SysWoW64 в 64-разрядной Windows?)

В этом случае вы хотели вызвать C:\Windows\System32\logoff.exe, но каким-то образом путь был перенаправлен в C:\Windows\SysWOW64\logoff.exe, который не существует. Итак, здесь вы получили ошибку "файл не найден".

Вы можете сделать эксперимент, чтобы доказать это. Просто скопируйте исполняемый файл в C:\Windows\SysWOW64\test1.exe и попробуйте запустить следующий код с mshta. Видишь магию?

    <script>new ActiveXObject("WScript.Shell").Run(
"C:\\Windows\\System32\\test1.exe");</script>

PS К моему удивлению, и mshta.exe, и wshom.ocx являются 64-битными, тогда почему Windows указывает путь к SysWOW64?

Решение

Instead of specifying the path C:\Windows\System32 use the special alias %WINDIR%\Sysnative

function fn_fecha()
{
WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("%WINDIR%/Sysnative/logoff.exe");
}

объяснение

Your 32-bit application is trying to access code in the %Windir%\System32 folder which is reserved for 64-bit code. Windows is silently redirecting your request as explained by this Microsoft KB article:

On a computer that is running a 64-bit version of Windows...a 32-bit application cannot access the following folder:

%WinDir%\System32

Therefore, the 32-bit application cannot start any 64-bit applications in the System32 folder. Additionally, the 32-bit application cannot retrieve file information about any files in the System32 folder or in the subfolders of the System32 folder....

Это происходит потому, что Windows в 64-разрядной версии Windows (WOW64) обеспечивает перенаправление файловой системы. В 64-разрядной версии Windows папка% WinDir% \ System32 зарезервирована для 64-разрядных приложений. Когда 32-разрядное приложение пытается получить доступ к папке System32, доступ перенаправляется в следующую папку:

% WINDIR%\SysWOW64

По умолчанию перенаправление файловой системы включено.

В твоем случае logoff.exe не существует в папке SysWOW64, что приводит к ошибке "файл не найден". В статье объясняется, что специальный псевдоним %WinDir%\Sysnative позволяет обойти нежелательное перенаправление файлов:

WOW64 распознает папку Sysnative как специальный псевдоним. Поэтому файловая система не перенаправляет доступ из папки Sysnative. Этот механизм является гибким и простым в использовании. Вы можете использовать папку Sysnative для обхода перенаправления файловой системы.

Обратите внимание, что исправление, упомянутое в статье, применимо только к Windows Server 2003/XP. Эта функциональность встроена в более поздние версии Windows.

Другие вопросы по тегам