ApplicationPool user vs StartInfo.Username?
本文关键字:Username StartInfo vs user ApplicationPool | 更新日期: 2023-09-27 17:49:46
我一直在测试(过去4天)在iis7 (asp.net)下启动进程的各种选项
我确实找到了解决方案。
只要我们不需要与桌面交互,只需要运行cmd
(或类似的),解决方案很简单:
-
w3wp
用户->
应该是高特权用户 -
进程启动信息(
StartInfo.Username
)->
应该是也是高权限用户
两个用户必须是相同的(如果我们想要
cmd
执行)!这是唯一可行的方法。
这是我的两个问题:
为什么两者必须相同?w3wp HighPrivileged
USerA
不能运行(通过process.startInfo)cmd
作为HighPrivilegedUSerB
?两个用户都是域管理员。(他们也是我本地组的管理员)。是否只有域管理员/本地管理员可以在本地机器上运行进程?
注。所有文件夹权限都是everyone : full controll
(包括c:'windows'*.* /s
和cmd.exe权限),正如前面提到的,这两个用户都是本地机器上的管理员,具有相同的克隆权限。IIS7处理程序映射*
[static file]设置为read+execute
另外,完整的cmd命令是:
cmd /c time /t >c:'1.txt
。如果文件存在,则表示成功。(只有当两个帐户相同时,我才成功)。
完整代码:
Process proc = new Process();
proc.StartInfo.FileName = "cmd";
proc.StartInfo.UserName = "Royin"; //<-- only if this user is the same as w3wp user , the operation succeed !
proc.StartInfo.Domain = ...;
proc.StartInfo.WorkingFolder = @"c:'windows'system32";
proc.StartInfo.Password = ...
proc.StartInfo.Arguments = @"/c time /t >c:'1.txt"
proc.Start();
好的,首先,我强烈建议使用优秀的SysInternals ProcessMonitor来帮助解决任何类似的问题:
这个应用程序基本上会告诉你进程试图采取的每一个动作,所以在你的情况下,你会看到它试图调用QueryOpen
, ProcessCreate
等。
您是否检查了失败场景下流程的ExitCode是什么?我愿意打赌它会以0xC0000142 (-1073741502)
的形式回来,这意味着"加载DLL失败"之类的东西。在system32路径下运行任何东西,即使具有特权用户凭证,也会遇到权限方面的奇怪问题,这也是由于创建进程的初始化过程。
Process.Start
流看起来像这样:
(假设:UserA ==运行w3wp的进程,UserB ==模拟ctx, UserC ==进程启动信息中指定的凭据)
首先,UserB不会有太大的影响,正如我们在其他对话中讨论的;任何进程创建的东西都将基于"启动实体"的进程令牌,所以UserA的凭据是我们将要看到的。
运行时说"嘿,UserA可以访问
StartInfo.FileName
中指定的文件名吗?"Windows回答yes/no,但也会提示"但是,要使用它,您还需要能够读取所有其他dll"
运行时响应"Ok, UserA可以访问这些dll吗?"
如果以上答案都是肯定的,那么运行时说"好,登录这个用户并尝试用cmd行和参数创建一个新进程…"
你很可能遇到#2或#4的问题,因为默认的应用程序池身份没有对System32文件夹的读访问权限。这就是为什么当您将w3wp进程的身份切换到特权帐户时,它可以工作。
你可以尝试一些事情,但最简单的选择可能是切换回低权限帐户(如默认的应用程序池身份),但授予只读访问system32文件夹的帐户。
我会绝对不会作为特权用户运行w3wp,尽管-这只是要求大量的头痛,如果有什么讨厌的事情发生,比如有人入侵你。
哦,最后的想法:
不要设置
UseShellExecute
为true如果你可以帮助它,它会做奇怪的事情。不要设置
LoadUserProfile
为true,如果你可以帮助它,它也会做奇怪的事情,而且真的很慢。DO如果可以,将
CreateNoWindow
设置为true,否则你会看到服务器上有很多窗口打开/关闭DO使用
RedirectStandardOutput / RedirectStandardError
而不是管道输出,它更可控,当事情出错时给出更好的反馈。DO总是检查进程的ExitCode,如果它看起来不像工作