最近在运行Win32 OpenProcess API和CreateProcessAsUser时,我遇到了“拒绝访问”错误(在我的情况下是错误代码5)。在我的情况下,我正在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://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment
在我的情况下,我想要添加SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege,我通过secpol.msc进行了添加:
您所需的特定权限可能取决于您使用的帐户,但我希望这可以帮助您!