我最近在运行 Win32 OpenProcess API 时遇到访问被拒绝错误(在我的情况下为错误代码 5),然后在运行 CreateProcessAsUser 时遇到。就我而言,我在 Windows 10 上运行,但我怀疑它是相似的,但自从我让它工作后,我想我会分享一些对我有帮助的东西。
当我使用 C# 时,我的 Win32 方法签名如下:
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
影响访问现有进程(在我的例子中是 winlogon.exe 进程)成功的一个关键因素是正确定义正确的“所需访问”值。就我而言,我使用了一个常量“MAXIMUM_ALLOWED”,定义为:
private const uint MAXIMUM_ALLOWED = 0x2000000;
对服务的调用如下所示:
IntPtr hProcess = OpenProcess(MAXIMUM_ALLOWED, false, targetWinlogonProcessId);
这建立了正确的访问方式。我还将我的进程(Web 服务)作为 LocalSystem 帐户运行,该帐户具有相当好的权限。它开始于:
请注意,我可以使用 SYSTEM 帐户运行此命令,方法是下载 PsExec.exe 并运行 PsExec.exe -i -s cmd.exe 以启动命令提示符,以便我可以使用该帐户查询权限。你可以在这里找到一个很好的权限列表:
https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment
就我而言,我想添加我通过 secpol.msc 添加的 SeAssignPrimaryTokenPrivilege 和 SeIncreaseQuotaPrivilege:
您所需的特定权限可能取决于您使用的帐户,但我希望这会有所帮助!