【问题标题】:Starting a process in C# with username & password throws "Access is Denied" exception使用用户名和密码在 C# 中启动进程会引发“访问被拒绝”异常
【发布时间】:2010-09-12 09:49:15
【问题描述】:

在运行模拟的 .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 而不是我需要的用户开始。

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

【问题讨论】:

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

标签: c# .net process permissions


【解决方案1】:

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

【讨论】:

  • 假设进程是VB6应用程序的exe。我是否需要在项目加载时也修改Vb6应用程序?或在 VB6 中创建一些 GLOBAL 参数以捕获从该程序发送的用户名或密码并检查这些参数是否存在然后执行 VB6 应用程序的登录屏幕的登录按钮单击。
  • @TejuMB 在最初的问题和我的回答中, ProcessStartInfo 仅用于将进程作为不同的 Windows 用户(可能是因为权限不同)。 ProcessStartInfo [link]msdn.microsoft.com/en-us/library/… 上有一个 Arguments 属性,因此您还可以发送参数,您可以修改您的 VB6 应用程序以接收这些参数,但这不在这个问题的范围内。
【解决方案2】:

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

【讨论】:

  • 如何将帐户添加到“身份验证后模拟客户端”策略中?
  • 在管理工具中,您会发现“本地安全策略”运行它并选择“用户权限分配”。在列表中找到“Impersonate a client after Authentication”并双击它。然后你只需要添加用户或用户所属的组。你可以在technet.microsoft.com/en-us/library/dn221967.aspx 阅读更多关于分配这个的含义。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我遇到了与您在项目中遇到的相同问题。 应该有一种方法可以使用给定的凭据从您的 Web 应用程序中生成一个进程,但在实践中,它充其量只是一个杂物。我最终做的只是让应用程序将信息推送到 MSMQ,并让 Windows 服务弹出队列中的项目并为请求提供服务。

    即使您的应用程序在模拟,它仍然希望在 aspnet 用户帐户下运行。

    【讨论】:

      【解决方案5】:

      检查Code Access Security 级别,因为Process 需要Full Trust。您的 Web 应用程序可能在部分信任设置中运行。

      从流程 MSDN 页面:

      权限

      * 链接需求
      以获得直接呼叫者的完全信任。部分受信任的代码不能使用此类。

      * 继承需求
      为继承人提供充分的信任。此类不能被部分受信任的代码继承。

      【讨论】:

        【解决方案6】:

        我想提一下,我已经尝试过代码 this site 包括 cmets 中提到的更新代码。此代码作为模拟身份运行该过程(这确实是我所需要的),但标准错误的重定向失败 - 因此此链接对于那些不关心处理标准错误的人可能有用。

        【讨论】:

          猜你喜欢
          • 2020-03-02
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-10
          相关资源
          最近更新 更多