使用用户名和密码在C#中启动进程会引发"访问被拒绝"异常

时间:2020-03-06 14:36:18  来源:igfitidea点击:

在运行模拟的.NET 3.5 Web应用程序内部,我试图通过以下方式执行一个过程:

var process = new Process 
             { StartInfo = 
                    { CreateNoWindow = true, 
                      FileName = "someFileName", 
                      Domain = "someDomain", 
                      Username = "someUserName", 
                      Password = securePassword, 
                      UseShellExecute = false
                    }
             };

process.Start();

-在web.config中将信任模式更改为完全模式无法解决。

-请注意,var securePassword是在代码前面设置的secureString。

这将引发异常,并显示"访问被拒绝"消息。如果删除用户名和密码信息,该异常消失,但是该过程以aspnet_wp而不是我需要的用户身份启动。

我在多个论坛中都看到过此问题,但从未见过提供的解决方案。
有任何想法吗?

解决方案

我遇到了与我们在项目中所做的相同的问题。应该有一种方法可以用给定的凭据从Web应用程序中生成一个进程,但是实际上,这充其量是一件麻烦事。我最后要做的只是让应用程序将信息推送到MSMQ,并拥有一个Windows服务,该服务会弹出队列中的项,从而为请求提供服务。

即使应用程序是假冒的,它仍然希望在aspnet用户帐户下运行。

我们可以使用ProcessStartInfo来指定凭据。诀窍在于密码是一个安全字符串,因此我们必须将其作为字节数组传递。

该代码可能类似于:

Dim startInfo As New ProcessStartInfo(programName)
        With startInfo
            .Domain = "test.local"
            .WorkingDirectory = My.Application.Info.DirectoryPath
            .UserName = "testuser"
            Dim pwd As New Security.SecureString
            For Each c As Char In "password"
                pwd.AppendChar(c)
            Next
            .Password = pwd

            'If you provide a value for the Password property, the UseShellExecute property must be false, or an InvalidOperationException will be thrown when the Process..::.Start(ProcessStartInfo) method is called. 
            .UseShellExecute = False

            .WindowStyle = ProcessWindowStyle.Hidden
        End With

检查"代码访问安全性"级别,因为进程需要"完全信任"。Web应用程序可能正在部分信任设置中运行。

在"过程MSDN"页面中:

Permissions

   * LinkDemand

     for full trust for the immediate caller. This class cannot be used by partially  trusted code.

   * InheritanceDemand

     for full trust for inheritors. This class cannot be inherited by partially trusted code.

我想提一下,我已经在
这个网站
包括注释中提到的更新代码。这段代码以模拟身份(实际上是我所需要的)运行该过程,但是标准错误的重定向失败-因此此链接对于不关心stderr的人可能有用。

不知道是否这样,但是我遇到了一个相关的问题,答案是该帐户无权在计算机上模拟。可以通过使用计算机上的本地策略管理器将帐户添加到"身份验证后模拟客户端"策略中来进行更改。

我采用了另一种方式,将整个应用程序放在我们自己作为模拟用户的状态下运行的自己的应用程序池中。现在,当asp.net产生新进程时,它是在用户上下文下而不是aspnet_wp产生的。不是我发布的问题的确切解决方案,但是它可以解决我们的问题。