4

我一直在测试(过去 4 天)在 iis7(asp.net)下启动进程的各种选项

确实找到了解决方案。

只要我们不需要与桌面交互,只需要运行cmd或类似的东西),解决方案就很简单:

  1. w3wp用户->应该是权限用户。

  2. 进程启动信息 ( StartInfo.Username)->应该是高权限用户。

但是,有一个问题(根据我的测试):

两个用户必须相同(如果我们要cmd执行)!这是唯一可行的方法。

所以这是我的两个问题:

  • 为什么它们必须相同?w3wp HighPrivileged不能作为HighPrivilegedUSerA运行(通过 process.startInfo)吗?cmdUSerB

  • 两个用户都是域管理员。(他们也是我本地组中的管理员)。只有域管理员/本地管理员可以在本地机器上运行进程吗?

ps 所有文件夹权限都是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();
4

1 回答 1

2

好的,首先,我强烈建议使用出色的 SysInternals ProcessMonitor 来帮助解决任何此类问题:Process Monitor

这个应用程序基本上会告诉你一个进程试图采取的每一个动作,所以在你的情况下,你会看到它尝试调用QueryOpen,ProcessCreate等。

您是否检查过失败场景下进程的 ExitCode 是什么?我愿意打赌它会以真钱的形式返回0xC0000142 (-1073741502),这意味着“加载 DLL 失败”之类的东西。在 system32 路径下运行任何东西,即使使用特权用户凭据,也会遇到奇怪的权限问题,这也是由于创建进程的初始化过程。

基本上,Process.Start流程看起来像这样:

(假设:UserA == 运行 w3wp 的进程,UserB == 模拟 ctx,UserC == 进程启动信息中指定的凭据)

  1. 首先,正如我们在其他对话中所讨论的,UserB 不会产生太大影响;任何流程创建内容都将基于“启动实体”的流程令牌,因此我们将查看 UserA 的凭据。

  2. 运行时说“嘿,UserA 可以访问指定的文件名StartInfo.FileName吗?”

  3. Windows 响应是/否,但也“但是,要使用它,您还需要能够读取所有这些其他 DLL”

  4. 运行时响应“好的,UserA 可以访问那些 DLL 吗?”

  5. 如果以上所有的答案都是肯定的,那么运行时会说“好的,登录这个用户并尝试使用 cmd 行和参数创建一个新进程......”

您很可能会遇到 #2 或 #4 的问题,因为默认应用程序池标识对 System32 文件夹没有读取访问权限。这就是为什么当您将 w3wp 进程的身份切换到特权帐户时,它可以工作的原因。

您可以尝试几件事,但最简单的选择可能是切换回低权限帐户(如默认应用程序池标识),但授予该帐户对 system32 文件夹的只读访问权限。

不过,我绝对不会以特权用户身份运行 w3wp - 如果发生任何令人讨厌的事情,比如有人攻击你,那只会让人头疼。

哦,最后的想法:

  • UseShellExecute如果你能帮助它,请不要设置为 true,它会做一些奇怪的事情。

  • LoadUserProfile如果你能帮上忙,不要设置为 true,它也会做一些奇怪的事情,而且速度也很慢。

  • 如果可以,请设置CreateNoWindow为 true,否则您会在服务器上看到很多窗口打开/关闭

  • 使用RedirectStandardOutput / RedirectStandardError而不是管道输出,它更可控,并且在出现问题时提供更好的反馈。

  • 如果它看起来不起作用,请务必检查进程的ExitCode

于 2012-12-29T22:53:38.050 回答