我一直在测试(过去 4 天)在 iis7 (asp.net) 下启动进程的各种选项
我确实找到了解决方案。
只要我们不需要与桌面交互,只需要运行cmd
(或类似的东西)解决方案很简单:
w3wp
用户->
应该是高 特权用户。进程启动信息 (
<StartInfo.Username
)->
应该是也是高权限用户。
但是,有一个问题(根据我的测试):
Both users have to be the same (if we want
cmd
to execute)! this is the only way it will work.
所以这是我的 2 个问题:
为什么它们必须相同?不能 w3wp HighPrivileged
USerA
运行(通过 process.startInfo)cmd
作为 HighPriviligedUSerB
?两个用户都是域管理员。(他们也是我本地组中的管理员)。是否只有域管理员/本地管理员可以在本地计算机上运行进程?
附注所有文件夹权限都是 everyone : full controll
(包括 c:\windows\*.*/s
并包括 cmd.exe 权限)并且如前所述,两个用户都是管理员在具有相同克隆权限的本地计算机上。IIS7 处理程序映射 *
[静态文件] 设置为读取+执行
此外,完整的 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 来帮助解决任何此类问题:Process Monitor .
这个应用程序基本上会告诉你一个进程试图采取的每一个 Action ,所以在你的情况下,你会看到它尝试调用 QueryOpen
、ProcessCreate
等.
您是否检查过在失败情况下进程的 ExitCode 是什么?我愿意用真金白银打赌它会以 0xC0000142 (-1073741502)
的形式返回,这意味着类似于“加载 DLL 失败”之类的东西。在 system32 路径下运行任何东西,即使使用特权用户凭据,也会遇到奇怪的权限问题,同样是由于创建进程的初始化过程。
基本上,Process.Start
流程看起来像这样:
(假设:UserA == 运行 w3wp 的进程,UserB == 模拟 ctx,UserC == 在进程启动信息中指定的凭据)
首先,正如我们在其他对话中讨论的那样,UserB 不会产生太大影响;任何流程创建内容都将基于“启动实体”的流程 token ,因此我们将查看 UserA 的凭据。
运行时说“嘿,UserA 可以访问
StartInfo.FileName
中指定的文件名吗?”Windows 响应是/否,但也“但是,要使用它,您还需要能够读取所有这些其他 DLL”
运行时响应“好的,UserA 可以访问那些 DLL 吗?”
如果以上所有问题的答案都是肯定的,那么运行时会说“好的,登录此用户并尝试使用 cmd 行和参数创建一个新进程...”
您很可能会遇到 #2 或 #4 的问题,因为默认的应用程序池标识没有对 System32 文件夹的读取访问权限。这就是为什么当您将 w3wp 进程的身份切换到特权帐户时,它会起作用。
您可以尝试一些方法,但最简单的选择可能是切换回低权限帐户(如默认应用程序池身份),但向该帐户授予对 system32 文件夹的只读访问权限。
不过,我绝对不会以特权用户身份运行 w3wp - 如果发生任何令人讨厌的事情,比如有人攻击你,那只会让你头疼。
哦,最后的想法:
不要如果您能帮助它,请将
UseShellExecute
设置为true,它会做一些奇怪的事情。不要 如果可以的话,请将
LoadUserProfile
设置为 true,它也会做一些奇怪的事情,而且速度也很慢。DO 如果可以,请将
CreateNoWindow
设置为 true,否则您会在服务器上看到很多窗口打开/关闭DO 使用
<RedirectStandardOutput/RedirectStandardError
而不是管道输出,它更易于控制,并在出现问题时提供更好的反馈。做 如果它看起来不正常,请始终检查进程的 ExitCode
关于c# - ApplicationPool 用户与 StartInfo.Username?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083202/