我一直在测试(过去4天)在iis7下启动流程的各种选项(asp.net)
我 找到了解决方案。
只要我们不需要与桌面交互,只需要运行cmd
(或类似),解决方案就很简单:
w3wp
用户->
应该是高特权用户。
流程启动信息(StartInfo.Username
)->
应该是 高权限用户。
然而,有一个问题(根据我的测试):
两个用户必须相同(如果我们想要
cmd
执行)!这是唯一可行的方式。
所以这是我的两个问题:
为什么两者必须相同?无法w3wp HighPrivileged USerA
运行(通过process.startInfo)cmd
作为 HighPriviliged USerB
?
这两个用户都是域管理员(也是我本地组中的管理员)。只有域管理员/本地管理员才能在本地计算机上运行进程吗?
P.S。所有文件夹权限都是everyone : full controll
(包括c:\windows\*.* /s
并包括cmd.exe权限),如上所述,这两个用户都是具有相同克隆权限的本地计算机上的管理员.IIS7处理程序映射*
[静态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();
答案 0 :(得分:2)
好的,首先,我强烈建议您使用优秀的SysInternals ProcessMonitor来解决任何问题:Process Monitor。
此应用基本上会告诉您进程尝试执行的每项操作,因此在您的情况下,您会看到它尝试拨打QueryOpen
,ProcessCreate
等。
您是否检查了失败方案下进程的ExitCode是什么?我愿意打赌真正的钱,它会以0xC0000142 (-1073741502)
的形式回归,这意味着“无法加载DLL”之类的东西。即使使用特权用户凭据,在system32路径下运行任何内容也会因为创建进程的初始化过程而遇到具有权限的古怪问题。
基本上,Process.Start
流看起来像这样:
(假设:UserA ==流程运行w3wp,UserB ==模仿ctx,UserC ==流程启动信息中指定的凭证)
首先,UserB不会产生太大影响,正如我们在其他对话中所讨论的那样;任何流程创建都将基于“启动实体”的 流程令牌 ,因此UserA的凭据就是我们将要查看的凭据。< / p>
运行时说“嘿,UserA可以访问StartInfo.FileName
中指定的文件名吗?”
Windows回答是/否,但也“但是,要使用它,你还需要能够读取所有这些其他DLL”
运行时响应“好的,UserA可以访问这些DLL吗?”
如果以上所有答案都是肯定的,那么运行时会说“好了,请登录此用户并尝试使用cmd行和参数创建一个新进程......”
您最有可能遇到#2或#4的问题,因为默认的应用程序池标识没有对System32文件夹的读访问权限。这就是为什么当您将w3wp进程的标识切换到特权帐户时,它可以正常工作。
您可以尝试一些事情,但最简单的选择可能是切换回低权限帐户(如默认应用程序池标识),但授予对该帐户的system32文件夹的只读访问权限。
我会绝对不会以特权用户的身份运行w3wp--这只是在发生任何令人讨厌的事情时会引起巨大的麻烦,就像有人在骚扰你一样。
哦,最后的想法:
请勿将UseShellExecute
设置为true,如果可以提供帮助的话,它确实很奇怪。
请勿将LoadUserProfile
设置为true,如果你可以帮助它,它也会做奇怪的事情,并且也很慢。
DO 将CreateNoWindow
设置为true,否则您将在服务器上看到许多窗口打开/关闭
DO 使用RedirectStandardOutput / RedirectStandardError
而不是管道输出,它更容易控制,并在出现问题时提供更好的反馈。
DO 总是检查流程的ExitCode,看它是否有效