使用用户名和密码在C#中启动进程会抛出“拒绝访问”exception

在运行模拟的.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。

这会抛出“Access is Denied”作为其消息的exception。 如果我删除用户名和密码信息,则exception消失,但该过程以aspnet_wp而不是我需要的用户开始。

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

您可以使用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 

不确定是不是这样,但我有一个相关的问题,答案是该帐户没有模仿机器的权限。 可以通过使用计算机上的本地策略管理器将帐户添加到策略“身份validation后模拟客户端”来更改此设置。

我采用了不同的方式,将整个应用程序放在自己的应用程序池中,作为我们最初模仿的用户运行。 现在,当asp.net产生一个新进程时,它会在用户的上下文而不是aspnet_wp下生成。 不是我发布的问题的确切解决方案,但它适用于我们的情况。

我遇到了你在项目上遇到的同样问题。 应该有一种方法可以使用给定的凭据从Web应用程序中生成一个进程,但实际上,它最多只是一个kludge。 我最终做的就是让应用程序将信息推送到MSMQ,并使用弹出Queue项目的Windows服务为请求提供服务。

即使您的appliation是模拟,它仍然希望在theaspnet用户帐户下运行。

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

从Process MSDN页面:

权限

* LinkDemand
为直接来电者提供完全信任。 部分受信任的代码不能使用此类。

* InheritanceDemand
对inheritance人的完全信任。 部分受信任的代码不能inheritance此类。

我想提一下,我在这个网站上尝试过代码,包括评论中提到的更新代码。 此代码将该过程作为模拟身份(这实际上是我所需要的)运行,但标准错误的重定向失败 – 因此,此链接对于那些不关心处理stderr的人来说非常有用。