2008-12-08 39 views
7

我在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服务代码变量:

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

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

当我明确指定窗口用户ProcesStartInfo属性域,用户和密码,我得到了以下信息: http://img201.imageshack.us/img201/5870/pstartah8.jpg

是否有可能从asp.net不同的凭据比ASPNET(IIS 5.1)启动过程?

+1

提到了完整的源代码示例工作任何关于它的最终解决方案包内

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

你的代码? – Kiquenet 2013-07-05 06:34:55

回答

3

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

GAC中的代码必须声明XXXPermission,其中XXX是您要求的任何权限,无论是模拟,访问硬盘还是您有什么。

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

您应该确保您放入GAC的DLL上的API没有滥用的机会。例如,如果您正在编写一个让用户通过命令行应用程序备份服务器的网站,那么您的API应该会公开一个类似于“BackUp()”而不是“LaunchAribraryProcess(字符串路径)”的方法。config文件也必须设置模拟,否则您将遇到NTFS权限问题以及CAS。

这里是complete explanation

0

你究竟想要做什么?我无法完全了解您的代码在创建不同的可执行文件时的作用。它看起来很奇怪。说明你首先想要解决的业务问题可能会更有帮助。

0

它看起来像你试图让IIS服务模仿比服务本身更高的权限的用户(在这种情况下是管理员)。 Windows将此视为一个安全漏洞,因为那时您基本上正在请求某人接管您的系统。可能有办法解决这个限制,但不这样做 - 这是为了你自己的利益。

而是让IIS模拟一个具有有限权限的用户,他拥有您需要的权限。例如。创建一个仅拥有您希望Web服务写入的文件夹的用户帐户,或者其他适当的权限组合。如果冒充一个有限的用户,你不会看到这个错误代码,但仍然可以调用你在这里的良性可执行文件。