我正在开发一个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打开的)。
发布于 2013-07-11 21:46:01
在Windows7 x64中,你可以找到文件夹"C:\ Windows \SysWOW64",其中包含一些32位应用程序和库,用于创建32位兼容环境。
(另请参阅:Why do 64-bit DLLs go to System32 and 32-bit DLLs to SysWoW64 on 64-bit 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>
附注:令我惊讶的是,mshta.exe和wshom.ocx都是64位的,那么为什么Windows要直接使用SysWOW64呢?
发布于 2016-03-24 04:08:40
解决方案
不要指定路径C:\Windows\System32,而是使用特殊别名%WINDIR%\Sysnative
function fn_fecha()
{
WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("%WINDIR%/Sysnative/logoff.exe");
}
解释
您的32位应用程序正在尝试访问%Windir%\System32文件夹中的代码,该文件夹是为64位代码保留的。Windows正在静默地重定向您的请求,如此Microsoft KB article所述
在运行64位版本的Windows...的计算机上的
...32位应用程序无法访问以下文件夹:
%WinDir%\System32
因此,32位应用程序无法启动System32文件夹中的任何64位应用程序。此外,32位应用程序无法检索有关System32文件夹或System32文件夹的子文件夹中的任何文件的文件信息...
出现此现象的原因是64位Windows (WOW64)提供了文件系统重定向。在64位版本的Windows...the中,%WinDir%\System32文件夹是为64位应用程序保留的。当32位应用程序尝试访问System32文件夹时,访问将重定向到以下文件夹:
%WinDir%\SysWOW64
默认情况下,文件系统重定向处于启用状态。
在本例中,SysWOW64文件夹中不存在logoff.exe
,因此会产生file not found错误。本文解释了特殊别名%WinDir%\Sysnative绕过了不需要的文件重定向:
WOW64将Sysnative文件夹识别为特殊别名。因此,文件系统不会将访问重定向到Sysnative文件夹之外。这种机制灵活且易于使用。您可以使用Sysnative文件夹绕过文件系统重定向。
请注意,本文中提到的修补程序仅适用于Windows Server 2003/XP。此功能内置于更高版本的Windows中。
https://stackoverflow.com/questions/17581409
复制相似问题