c# - ApplicationPool 用户与 StartInfo.Username?

标签 c# iis process iis-7.5 w3wp

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

确实找到了解决方案。

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

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

  2. 进程启动信息 (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 HighPrivilegedUSerA 运行(通过 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 ,所以在你的情况下,你会看到它尝试调用 QueryOpenProcessCreate 等.

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

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

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

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

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

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

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

  5. 如果以上所有问题的答案都是肯定的,那么运行时会说“好的,登录此用户并尝试使用 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/

相关文章:

asp.net - 在 IIS 中运行并连接到 Visual Studio Online 时,TFS API 在 ASP.NET MVC 应用程序中不起作用

c - 防止子进程成为孤儿进程

Python进程类型错误: no default __reduce__ due to non-trivial __cinit__

c# - 有没有一种方法可以在不破坏注释和格式的情况下以编程方式将值保存到 web.config appSettings?

c# - 使用滤镜按钮时更改其颜色

c# - xaml 文本框控件中的光标位置

c# - asp.net mvc4 中 web.config 中的 Windows 身份验证

.net - 如何使用 C# 代码获取 IIS 虚拟目录和 Web 应用程序的物理路径?

ios - AFNetworking 和批处理/串行操作

c# - 如何使用与角色连接的附加表来扩展 ASP.NET MVC Identity?