【问题标题】:C# Process.Start with another user not working in Windows 8/10C# Process.Start 另一个用户不在 Windows 8/10 中工作
【发布时间】:2015-10-26 17:42:31
【问题描述】:

我有一个程序,我使用域用户启动 USMT(加载或扫描状态),该域用户在本地计算机上提供管理权限。这在 Windows 7 中运行良好。

程序需要以非管理员用户身份启动,但以管理员权限执行加载/扫描状态。

但是,当正确运行 load/scanstate 时它会失败,因为它没有被当前提升。但是,如果没有管理权限,我该如何克服呢?

最好的问候 托马斯·尼森

        ProcessStartInfo restoreProcessInfo = new ProcessStartInfo
        {
            Verb = "runas",
            UseShellExecute = false,
            Domain = strAdminDomain,
            UserName = strAdminUsername,
            Password = strAdminPassword,
            FileName = loadstate.exe",
            Arguments = "blablabla"
        }

【问题讨论】:

  • 您的意思是您的 exe 可以由非管理员用户执行,但 exe 中的一段逻辑必须以提升的权限执行?
  • 正确,加载和扫描状态需要管理权限才能运行。但用户不是管理员,因此无法直接运行。因此,我需要与另一个用户一起启动进程,赋予他们本地管理员权限。

标签: c# windows-8 permissions windows-10


【解决方案1】:

据我所知,“runas”动词(实际上是任何动词)只有在 UseShellExecute 设置为 true 时才会受到尊重。尝试将 UseShellExecute 设置为 true,同时使用 WindowStyle 属性隐藏 shell 窗口。

但是,这将阻止您从进程中捕获输入和输出流。这是你有兴趣做的事情吗?

【讨论】:

  • 是的,我还得出结论,runas 无论如何都不会比它不存在更好,至少当 UseShellExecute 为假时。但是我不能将 UseShellExecute 设置为 true 因为我不能从提供的用户名和密码开始。我还需要打开窗口,否则我无法了解进程的进展情况,并且我需要退出代码。
  • 您仍将获得退出代码,但您的应用程序将无法使用 i/o 流。当然,隐藏窗口是可选的。
  • 好的,但是仍然存在 UseShellExecute 为 true 不允许我为 ProcessStartInfo 使用用户名和密码参数的问题
  • 无论执行模式如何,用户名和密码仍然受到尊重。
  • 显然不是,因为我得到了这个异常“进程对象必须将 UseShellExecute 属性设置为 false 才能以用户身份启动进程”
【解决方案2】:

您可以冒充用户。模拟是线程使用与拥有该线程的进程不同的安全信息执行的能力。

检查this 线程以了解如何实现模拟。因此,该进程最初将使用 windows 域用户的权限执行,并且放置在模拟块中的逻辑将以模拟用户的权限执行。

//Code outside the impersonation block will be executed with current user privilege

Using(Impersonator impersonator = new Impersonator())
{
  //Code written within this block will be executed with elevated(impersonated) user privilege.
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2022-08-07
    • 2014-08-01
    • 2019-02-09
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多