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

时间:2014-12-08 16:29:05

标签: winapi iis permissions pinvoke

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

  

Process.Start在内部调用CreateProcessWithLogonW(CPLW)   凭证已指定。无法调用CreateProcessWithLogonW   来自Windows服务环境(例如IIS WCF服务)。它   只能从交互式进程(应用程序)中调用   由通过CTRL-ALT-DELETE登录的用户启动。    - from this SO answer

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

对于所有配置,我从IIS Express获得“客户端未拥有所需权限”。在服务器上,我得到了相同的运行控制台应用程序。但是发布应用程序,似乎开始这个过程很好,但后来我似乎得到了权限错误。

我想知道在本地运行时我的帐户丢失的WHICH权限,所以我可以正确调试它们(最终弄清楚我得到的任何权限错误)。有什么方法可以确定吗?无论哪种方式,如果你知道问题是什么,我也会喜欢它!

谢谢!

1 个答案:

答案 0 :(得分:4)

根据文件:

CreateProcessAsUser function

  

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

调用线程可以使用OpenThreadToken()AdjustTokenPrivileges()根据需要启用单个权限,然后再调用CreateProcessAsUser()。但是因为它无论如何都在内部执行,这意味着与调用线程关联的用户没有可用的权限。