- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
作为来自 *nix 世界的人,我对 Windows 行为及其安全系统感到非常困惑。
我只是想在我的应用程序中执行一个外部程序。我发现 WinAPI 函数 ShellExecute 可以按预期工作,但启动位于 %windir%\System32 子目录中的一些程序时除外。
ping.exe执行成功
ShellExecute(NULL, "open", "c:\\Windows\\System32\\ping.exe', NULL, NULL, SW_SHOW) );
// ^^^ OK, retcode == 42
java.exe执行失败
ShellExecute(NULL, "open", "c:\\Windows\\System32\\java.exe', NULL, NULL, SW_SHOW) );
// ^^^ ERROR_FILE_NOT_FOUND, retcode == 2
很奇怪,因为java.exe在System32中确实存在,对Users组有读/执行权限,可以从cmd调用。
C:\>dir /q c:\Windows\System32\java.exe
Volume in drive C has no label.
Volume Serial Number is 56E3-0868
Directory of c:\Windows\System32
11.01.2012 23:40 172 320 NT AUTHORITY\SYSTEM java.exe
1 File(s) 172 320 bytes
0 Dir(s) 226 127 564 800 bytes free
C:\>cacls c:\Windows\System32\java.exe
c:\Windows\System32\java.exe NT AUTHORITY\SYSTEM:F
BUILTIN\Administrators:F
BUILTIN\Users:R
我在这里错过了什么?
操作系统是 Windows 7 家庭版。
更新:如果我将 c:\Windows\Sytem32\calc.exe 复制到 c:\Windows\Sytem32\calc2.exe,ShellExecute 可以运行原始 calc.exe 但失败calc2.exe 虽然文件是相同的!! 唯一的区别是缺少 calc2.exe 和 java.exe 的 TrustedInstaller 组的附加权限。巧合?
最佳答案
您运行的是 64 位操作系统吗?
如果是这样,C:\Windows\System32
将包含 64 位二进制文件,而 C:\Windows\SysWOW64
将包含 32 位二进制文件(是的,确实是方式)。出于向后兼容的原因,当运行 32 位进程时,Windows 会将对 C:\Windows\System32
的访问重定向到 C:\Windows\SysWOW64
。
因此,如果您使用 32 位进程查看 C:\Windows\System32
,您实际上看到的是 C:\Windows\SysWOW64
中的内容.
您可以调用Wow64DisableWow64FsRedirection
功能来禁用此行为。请注意文档中的警告并仔细考虑它是否适用于您的情况:
Note: The
Wow64DisableWow64FsRedirection
function affects all file operations performed by the current thread, which can have unintended consequences if file system redirection is disabled for any length of time. For example, DLL loading depends on file system redirection, so disabling file system redirection will cause DLL loading to fail. Also, many feature implementations use delayed loading and will fail while redirection is disabled. The failure state of the initial delay-load operation is persisted, so any subsequent use of the delay-load function will fail even after file system redirection is re-enabled. To avoid these problems, disable file system redirection immediately before calls to specific file I/O functions (such asCreateFile
) that must not be redirected, and re-enable file system redirection immediately afterward usingWow64RevertWow64FsRedirection
.
关于c++ - 为什么 ShellExecute 找不到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837059/
我想使用 ShellExec 在“配置”模式下运行屏幕保护程序。我使用这个 (Delphi) 调用: i:= ShellExecute(0, 'open', PChar('c:\temp\test.
我需要使用 ShellExecute 从我的 VB6 代码执行一个外部程序:我面临的问题是,当路径字符串有任何空间时,它不起作用: Dim Path As String Path = "E:\PROY
我是shell脚本的新手,最近我在脚本中看到一个命令“:>文件”,我不明白它的意思,谁能告诉我这个命令在做什么? 提前致谢 最佳答案 :是一个空操作。 >是重定向,因此文件被 no-op 命令的输出覆
有了这个 ShellExecute(Handle, 'print', PChar(ExtractFilePath(ParamStr(0))+'Test.txt'), nil, nil, SW_H
我尝试通过delphi在shell中执行命令,但它不起作用。我使用这个脚本: var shellexecommand:string; begin ShellExecute(0, nil, 'cmd.e
我正在尝试使用ShellExecute在 Excel 中打开文件。我在MSDN论坛上阅读了有关该函数的信息,发现了以下有关句柄的信息,即第一个参数: “hwnd [in] 用于显示用户界面 (UI)
我有一个程序在执行 ShellExecute() 指令时崩溃。如果我使用 system() 方法,一切正常,但我读过 system() 是邪恶的...... 我使用的是 Visual Studio 2
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
例如我需要运行: ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE); 作为新线程,但我不知道如何。我试过这个: HANDLE
我的任务是每周检查一次数据库并检查所有链接。我通常在 PHP 中工作,但在 PHP 中这样做会非常慢(实际上它会在大约 100 个 URL 后使页面超时),所以我决定制作一个快速的 C++ 应用程序。
我正在使用 ShellExecute(NULL, L"open", szSomeDirectory, 0, 0, SW_SHOWDEFAULT) 在资源管理器中打开一个目录。 我正在尝试打开一个目录,
我正在使用 ShellExecute WIN API 来运行 DOS 命令,因为在我运行应用程序时会看到 DOS 命令闪烁。下面是 ShellExecute API 调用。 ret = ShellEx
Createprocess API 有一个选项可以创建带有 CREATE_SUSPENDED 标志的进程。相似之处是,ShellExecute API 是否有可能在挂起状态下创建进程。 最佳答案 没有
程序 1 使用 SetEnvironment 并调用 ShellExecute 来启动程序 2。程序 2 调用 GetEnvironment 并从中检索值。令人惊讶的是,正如我在 MSDN 中读到的那
我正在学习如何使用 Python 打印文件。我找到了很多方法来做到这一点,我见过的最常见的方法之一是使用 win32api 模块。 import win32api win32api.ShellExec
成功时,ShellExecute 返回一个句柄。 我们是否需要关闭这个句柄,如果需要,如何关闭? 根据我微软公布的例子,我们不需要关闭这个句柄。但是 ShellExecute 本身的文档对这个主题保持
我有一个 VB6 应用程序,它使用以下方法打开文件及其关联的应用程序: ShellExecute(0, "open", filename, params, vbNullString, vbNormal
我计划使用 ShellExecute 作为用 delphi 2007 编写的应用程序的更新程序,我想知道 ShellExecute 是否可以在大多数使用 Win 的计算机上运行,或者是否会因为某些
我有一个 Delphi 应用程序,它使用 ShellExecute 在按下按钮时调用第二个 Delphi 应用程序。 应用程序存储在同一服务器上的同一网络共享上。它们的路径格式如下: const
我有一个希望很快的问题:是否可以稍微延迟 ShellExecute 的执行? 我有一个带有自动更新程序的应用程序。下载所有必需的文件等后,它将当前文件重命名为 *.OLD,并将新文件重命名为以前的文件
我是一名优秀的程序员,十分优秀!