C# 向特定AppPool标识添加缺少的权限,以允许从ASP.NET调用CreateProcessWithLogonW

C# 向特定AppPool标识添加缺少的权限,以允许从ASP.NET调用CreateProcessWithLogonW,c#,asp.net,iis,permissions,C#,Asp.net,Iis,Permissions,TL;DR:我需要从IIS托管的ASP.NET应用程序中调用CreateProcessWithLogonNW,以便在不同帐户下调用外部可执行文件并将作业委派给它。我该怎么做 我不能简单地使用Process.StartAPI的原因是外部可执行文件有许多需要配置的COM依赖项。这需要确保存在多个注册表项,并且帐户具有所需的启动和激活权限,这些权限需要通过DCOM配置进行设置。只需说,对于我们拥有的每台服务器上的每个AppPool标识,这已经证明是非常难以管理的 其思想是在每个系统上创建一个额外的交

TL;DR:我需要从IIS托管的ASP.NET应用程序中调用
CreateProcessWithLogonNW
,以便在不同帐户下调用外部可执行文件并将作业委派给它。我该怎么做


我不能简单地使用
Process.Start
API的原因是外部可执行文件有许多需要配置的COM依赖项。这需要确保存在多个注册表项,并且帐户具有所需的启动和激活权限,这些权限需要通过DCOM配置进行设置。只需说,对于我们拥有的每台服务器上的每个AppPool标识,这已经证明是非常难以管理的

其思想是在每个系统上创建一个额外的交互式帐户,根据需要进行配置,然后测试外部可执行文件是否可以手动成功运行

现在的问题是如何从ASP.NET应用程序启动此可执行文件,并让它在新帐户下运行(只是可执行文件,而不是整个ASP.NET应用程序!)

简单地调用
CreateProcessWithLogonNW
会导致“拒绝访问”错误,我被告知这是由于AppPool标识的特权不足造成的

我一直在互联网上搜索,我看到了很多关于如何向AppPool身份授予文件系统权限的答案。但是,除了将标识更改为其他内容之外,关于
CreateProcessWithLogonW
的权限没有任何内容

但我仍然想知道是否有办法为此配置AppPool标识

我不喜欢像其他地方建议的那样将身份更改为
本地服务
本地系统
。我担心它可能会启用ASP.NET应用程序实际上并不需要的未知附加权限,这反过来可能会改变相当大的代码库的安全影响


我承认我可能对身份更改有一种“龙来了!!!”的反应,但我也很想知道为什么我不能简单地向现有身份添加一个附加权限?

将身份更改为
LocalSystem
无论如何都不会起作用,因为
CreateProcessWithLogonNW
明确说明了这将不起作用,以及为什么IIS应用程序池标识不能起作用的原因(以及您可以尝试的方法):“您不能从“LocalSystem”下运行的进程调用
CreateProcessWithLogonNW
帐户,因为函数在调用方令牌中使用登录SID,“LocalSystem”帐户的令牌不包含此SID。或者,使用
CreateProcessAsUser
LogonUser
函数。“@JeroenMostert:LogonUser+DuplicateToken+CreateProcessAsUser组合是我尝试的第一件事。即使在管理帐户下运行的独立控制台应用程序测试中也无法使其工作,我放弃了。CreateProcessAsUser总是抛出”“拒绝访问”。我承认我可能做错了什么,我不确定了,tbh.CreateProcessWithLogonW在同一个控制台应用程序测试中也能工作,但是,我想让它在ASP.NET下也能工作。
CreateProcessAsUser
更难使用,因为它还需要声明一个(或两个)特权。您可以尝试将ASP.NET进程标识设置为一个简单、交互式的本地帐户(不是管理员,不是本地系统)。根据CPAU的文档,
CreateProcessWithLogonW
实际上不需要特殊权限;原因是它不能与
LocalSystem
(可能还有其他未以交互方式登录的身份,如默认的应用程序池身份)似乎是另一种性质的,我不确定通过在这里或那里调整安全令牌是否可以解决。@Jeroenmoster:我很有信心您提出的解决方案会奏效,是的。我只是不高兴Windows的权限模型如此有限。在这种情况下,我宁愿在这里明确区分关注点,并将其隔离他将功能整合到一个单独的本地服务中,在那里我可以更严格地控制实际的API调用。感谢您的帮助!如果您愿意,可以将您的建议作为答案发布,我会接受!将标识更改为
LocalSystem
无论如何都不会起作用,因为
CreateProcessWithLogonW
说明这将不起作用的文档,以及为什么IIS应用程序池标识不能起作用的原因(以及您可以尝试的方法):“您不能从“LocalSystem”下运行的进程调用
CreateProcessWithLogonW
。”帐户,因为该函数在调用方令牌中使用登录SID,“LocalSystem”帐户的令牌不包含此SID。或者,使用
CreateProcessAsUser
LogonUser
函数。@JeroenMostert:LogonUser+DuplicateToken+CreateProcessAsUser组合是我尝试的第一件事。我放弃了,因为即使在独立控制台应用程序测试中,在管理员帐户下运行,它也无法工作。CreateProcessAsUser总是抛出“拒绝访问”.我承认我可能做错了什么,我不确定了,tbh.CreateProcessWithLogonW确实在同一个控制台应用程序测试中工作,但是,我想让它也在ASP.NET下工作。
CreateProcessAsUser
更难使用,因为它还需要声明一个(或两个)特权。您可以尝试将ASP.NET进程标识设置为一个简单、交互式的本地帐户(不是管理员,不是本地系统)。根据CPAU的文档,
CreateProcessWithLogonW
实际上不需要特殊权限;原因是它不能与
LocalSystem
(可能还有其他不以交互方式登录的身份,如默认的应用程序池身份)似乎是