【问题标题】:Process start and Impersonation进程启动和模拟
【发布时间】:2010-09-25 21:40:26
【问题描述】:

我在 ASP.NET 2.0 的模拟上下文中启动进程时遇到问题。

我正在我的 Web 服务代码中启动新进程。 IIS 5.1、.NET 2.0

[WebMethod]
public string HelloWorld()
{
    string path = @"C:\KB\GetWindowUser.exe";
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.WorkingDirectory = Path.GetDirectoryName(path);
    startInfo.FileName = path;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.ErrorDialog = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    Process docCreateProcess = Process.Start(startInfo);

    string errors = docCreateProcess.StandardError.ReadToEnd();
    string output = docCreateProcess.StandardOutput.ReadToEnd();
}

“C:\KB\GetWindowUser.exe”是包含以下代码的控制台应用程序:

static void Main(string[] args)
{
    Console.WriteLine("Windows: " + WindowsIdentity.GetCurrent().Name);
}

当我在没有模拟的情况下调用 Web 服务时,一切正常。

当我打开模拟时,Web服务代码中的“errors”变量中写入了以下错误:

未处理的异常:System.Security.SecurityException:访问被拒绝。\r\n\r\n 在 System.Security.Principal.WindowsIdentity.GetCurrentInternal(TokenAccessLevels desiredAccess, Boolean threadOnly)\r\n 在 System.Security。 ObfuscatedMdc.Program.Main(String[] args) 处的 Principal.WindowsIdentity.GetCurrent()\r\n\r\n失败的程序集的区域是:\r\nMyComputer

模拟用户是本地管理员,可以访问 C:\KB\GetWindowUser.exe 可执行文件。

当我在 ProcesStartInfo 属性域、用户和密码中明确指定窗口用户时,我收到以下消息: http://img201.imageshack.us/img201/5870/pstartah8.jpg

是否可以从 asp.net (IIS 5.1) 使用与 ASPNET 不同的凭据启动进程?

【问题讨论】:

  • 任何带有完整源代码示例的最终解决方案?

标签: c# .net iis-5


【解决方案1】:

您必须将特权代码放入 GAC(或以完全信任的方式运行)。

GAC 中的代码必须声明 XXXPermission,其中 XXX 是您请求的任何权限,无论是模拟、访问硬盘驱动器还是您拥有的权限。

您应该在之后立即恢复断言。

您应该确保您放在 GAC 中的 DLL 上的 API 没有被滥用的机会。例如,如果您正在编写一个让用户通过命令行应用程序备份服务器的网站,那么您的 API 应该旧时公开一个类似“BackUp()”的方法,而不是“LaunchAribitraryProcess(string path)”

web.config 文件也必须设置模拟,否则您将遇到 NTFS 权限问题以及 CAS。

这里是complete explanation

【讨论】:

    【解决方案2】:

    您也可以尝试将代码封装在里面

    using (Impersonator person = new Impersonator("domainName", "userName",
    "password")
    {
        // do something requiring special permissions
    }
    

    如中所述 http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.windowsforms/topic62740.aspx

    【讨论】:

      【解决方案3】:

      你到底想做什么?我不太明白您的代码在创建不同的可执行文件方面有什么意义。它看起来很奇怪。或许先说明您要解决的业务问题会更有帮助。

      【讨论】:

        【解决方案4】:

        您似乎正试图让 IIS 服务模拟具有比服务本身更高权限的用户(在本例中为管理员)。 Windows 将其作为安全漏洞加以阻止,因为此时您基本上是在乞求某人接管您的系统。可能有办法解决这个限制,但不要这样做——这是为了你好。

        相反,让 IIS 模拟具有有限权限的用户,该用户拥有您需要的权限。例如。创建一个用户帐户,该帐户仅拥有您希望 Web 服务写入的文件夹,或任何其他适当的权限组合。如果冒充受限用户,您不会看到此错误代码,但应该仍然能够调用您在此处拥有的良性可执行文件。

        【讨论】:

          猜你喜欢
          • 2017-10-21
          • 1970-01-01
          • 2013-11-07
          • 2017-07-12
          • 2012-04-14
          • 2021-12-25
          • 2014-10-16
          • 2012-01-24
          • 2018-03-07
          相关资源
          最近更新 更多