CreateProcessAsUser() 给出“客户端不持有所需的权限”是哪一个?

Jas*_*ban 4 iis permissions pinvoke winapi

使用在我的交互式会话中运行的 IIS Express 中的 System.Diagnostic.Process.Start(),我可以执行以具有校正功能的不同用户身份运行的程序。不幸的是,这似乎不适用于非交互式会话。

指定凭据时,Process.Start 在内部调用 CreateProcessWithLogonW(CPLW)。CreateProcessWithLogonW 不能从 Windows 服务环境(如 IIS WCF 服务)调用。它只能从交互式进程(由通过 CTRL-ALT-DELETE 登录的用户启动的应用程序)中调用。-从这个 SO 答案

我需要将此站点从应用程序池帐户发布到 IIS 8。所以我按照上面引用的答案的建议 CreateProcessAsUser 。我已经使用本地安全策略设置了服务帐户和代理帐户,并按照该答案中的建议重新启动 - 服务帐户可以替换令牌,修改配额,代理帐户可以批量登录(以及作为该测试的服务)。但我不能让它在IIS快递(或控制台测试应用程序)的工作,也不IIS 8.我已经试过运行的LOGON32_LOGON_BATCHLOGON32_LOGON_NETWORK_CLEARTEXT以及LOGON32_LOGON_SERVICE,甚至LOGON32_LOGON_INTERACTIVE。我什至给了我自己的帐户“作为服务登录”和“作为操作系统的一部分”特权,没有任何变化——所有这些都在重新启动后进行了测试。

对于所有配置,我都从 IIS Express 收到“客户端不持有所需的特权”。在服务器上,我得到相同的运行控制台应用程序。但是发布应用程序,它似乎可以很好地启动该过程,但随后我似乎遇到了权限错误。

我想知道我的帐户在本地运行时缺少哪些权限,以便我可以正确调试它们(并最终找出我遇到的任何权限错误)。有什么办法可以确定吗?无论哪种方式,如果您知道问题所在,我也希望如此!

谢谢!

Rem*_*eau 5

根据文档:

CreateProcessAsUser 函数

通常,调用 CreateProcessAsUser 函数的进程必须具有 SE_INCREASE_QUOTA_NAME 权限,如果令牌不可分配,则可能需要 SE_ASSIGNPRIMARYTOKEN_NAME 权限。如果此函数因 ERROR_PRIVILEGE_NOT_HELD (1314) 而失败,请改用 CreateProcessWithLogonW 函数。CreateProcessWithLogonW 不需要特殊权限,但必须允许指定的用户帐户交互登录。通常,最好使用 CreateProcessWithLogonW 创建具有备用凭据的进程。
...
如果 hToken 是调用者主令牌的受限版本,则不需要 SE_ASSIGNPRIMARYTOKEN_NAME 权限。如果尚未启用必要的权限,CreateProcessAsUser 会在调用期间启用它们。

在调用 之前,调用线程可以根据需要使用OpenThreadToken()AdjustTokenPrivileges()启用单个权限CreateProcessAsUser()。但是由于它在内部无论如何都是这样做的,这意味着与调用线程关联的用户没有那些可用的权限。