在我的交互式会话中运行的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_BATCH
,LOGON32_LOGON_NETWORK_CLEARTEXT
和LOGON32_LOGON_SERVICE
运行,甚至LOGON32_LOGON_INTERACTIVE
。我甚至给自己的帐户“登录为服务”和“作为操作系统的一部分”权限,没有任何变化 - 所有都在重新启动后进行了测试。
对于所有配置,我从IIS Express获得“客户端未拥有所需权限”。在服务器上,我得到了相同的运行控制台应用程序。但是发布应用程序,似乎开始这个过程很好,但后来我似乎得到了权限错误。
我想知道在本地运行时我的帐户丢失的WHICH权限,所以我可以正确调试它们(最终弄清楚我得到的任何权限错误)。有什么方法可以确定吗?无论哪种方式,如果你知道问题是什么,我也会喜欢它!
谢谢!
答案 0 :(得分:4)
根据文件:
通常,调用CreateProcessAsUser函数的进程必须具有SE_INCREASE_QUOTA_NAME权限,并且如果令牌不可分配,则可能需要SE_ASSIGNPRIMARYTOKEN_NAME权限。如果此函数因ERROR_PRIVILEGE_NOT_HELD(1314)而失败,请使用CreateProcessWithLogonW功能而不是。 CreateProcessWithLogonW不需要特殊权限,但必须允许指定的用户帐户以交互方式登录。通常,最好使用CreateProcessWithLogonW来创建具有备用凭据的进程 ...
如果hToken是呼叫者主要令牌的受限版本,则不需要SE_ASSIGNPRIMARYTOKEN_NAME权限。 如果尚未启用必要的权限,CreateProcessAsUser会在通话期间启用它们。
调用线程可以使用OpenThreadToken()
和AdjustTokenPrivileges()
根据需要启用单个权限,然后再调用CreateProcessAsUser()
。但是因为它无论如何都在内部执行,这意味着与调用线程关联的用户没有可用的权限。