ApplicationPool user vs StartInfo.Username?

本文关键字:Username StartInfo vs user ApplicationPool | 更新日期: 2023-09-27 17:49:46

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

确实找到了解决方案。

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

  1. w3wp用户->应该是特权用户

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

然而,这里有一个陷阱(根据我的测试):

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

这是我的两个问题:

  • 为什么两者必须相同?w3wp HighPrivileged USerA不能运行(通过process.startInfo) cmd作为HighPrivileged USerB ?

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

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

ApplicationPool user vs StartInfo.Username?

好的,首先,我强烈建议使用优秀的SysInternals ProcessMonitor来帮助解决任何类似的问题:

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

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

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

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

  1. 首先,UserB不会有太大的影响,正如我们在其他对话中讨论的;任何进程创建的东西都将基于"启动实体"的进程令牌,所以UserA的凭据是我们将要看到的。

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

  3. Windows回答yes/no,但也会提示"但是,要使用它,您还需要能够读取所有其他dll"

  4. 运行时响应"Ok, UserA可以访问这些dll吗?"

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

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

你可以尝试一些事情,但最简单的选择可能是切换回低权限帐户(如默认的应用程序池身份),但授予只读访问system32文件夹的帐户。

我会绝对不会作为特权用户运行w3wp,尽管-这只是要求大量的头痛,如果有什么讨厌的事情发生,比如有人入侵你。

哦,最后的想法:

  • 不要设置UseShellExecute为true如果你可以帮助它,它会做奇怪的事情。

  • 不要设置LoadUserProfile为true,如果你可以帮助它,它也会做奇怪的事情,而且真的很慢。

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

  • DO使用RedirectStandardOutput / RedirectStandardError而不是管道输出,它更可控,当事情出错时给出更好的反馈。

  • DO总是检查进程的ExitCode,如果它看起来不像工作