【问题标题】:Start background process as a different user without showing window以其他用户身份启动后台进程而不显示窗口
【发布时间】:2019-03-26 17:49:20
【问题描述】:

我想使用特定的用户帐户从控制台启动应用程序,但不显示窗口。我已经阅读了有关此主题的多篇 Stack Overflow 文章,但建议的解决方案似乎都不适合我。我可以启动应用程序,但在传递用户名/密码时,我无法阻止弹出窗口

我设法让以下代码在我的计算机 (Windows 10) 上运行,但它无法在目标计算机 (Windows 7) 上运行。

目标框架:.NET 4.5.2

代码在使用输出类型控制台应用程序的无窗口 WPF 应用程序中执行,因为普通控制台应用程序无法运行。

private void StartProcess(string appPath, string user, SecureString password, string domain)
{
    var processStartInfo = new ProcessStartInfo
    {
        FileName = appPath,
        WorkingDirectory = Path.GetDirectoryName(appPath),
        CreateNoWindow = true,
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
        Password = password,
        UserName = user,
        Domain = domain,
        RedirectStandardError = false,
        RedirectStandardOutput = false
    };

    Process.Start(processStartInfo);
}

我的应用程序将从控制台启动,目标也是一个控制台应用程序。

如何确保进程在后台运行,而在 Windows 7 下不出现窗口?

部分文章:

【问题讨论】:

  • 为什么这被标记为 WPF ?
  • 请附上一些您尝试过但没有成功的文章的链接。例如,Running an application as different user 提到了 PsExec 的使用,Run Code as a different user 提到了 P/Invoke 的使用。
  • @Peregrine 来自 OP“代码在无窗口 WPF 应用程序中执行”
  • @HereticMonkey:称它为 WPF 至少是有问题的。最好包含有关环境的信息,但这似乎主要与 CreateNoWindow = true 未按预期工作的进程有关。
  • @Christopher... 所以编辑问题并删除标签。不知道为什么没有人这样做......

标签: c#


【解决方案1】:

奇怪。 CreateNoWindow = true 绝对应该这样做(防止 Window 生成)。除了明显的情况(这不是您实际运行的代码)之外,我还有一些想法。很多时候程序需要解决无法使用窗口的问题。所以他们开始一个单独的过程/一个拥有这些权利的自己的新实例。

服务do not get interactive Sessions by default as of Vista(你不应该忽略它)。所以他们要么有一个由 Task Sheduler 启动的辅助进程。或者只是通过 Process 强制启动它。对于一些旧代码,例如 (t)rusty COM Officer interop,明确需要交互式会话。

如果你有这样的程序,你基本上是在玩另一个名字的顶级游戏:https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253

【讨论】:

    【解决方案2】:

    你可以试试这个:

    private void StartProcess(string appPath, string user, SecureString password, string domain)
    {
        var processStartInfo = new ProcessStartInfo
        {
            FileName = appPath,
            WorkingDirectory = Path.GetDirectoryName(appPath),
            CreateNoWindow = true,
            UseShellExecute = false,
            WindowStyle = ProcessWindowStyle.Hidden,
            RedirectStandardOutput = false,
            RedirectStandardError = false,
            Verb = string.Format("runas /user:{0}\\{1} /password:{2}", domain, user, password)
        };
        Process.Start(processStartInfo);
    }
    

    【讨论】:

    • 这应该更有可能导致这样的问题。现在你是一个正在运行的“runas”,CreateNoWindow = true。不应该由任何 runas 开始所固有的属性。当您尝试在批处理文件上使用提升时,您会遇到类似的问题:您提升的​​是解释器。
    • 这似乎有效,干杯!不过还得再测试一下。
    • @Greg:如果可行,那意味着我对 Process 和 Runas 如何工作/交互的所有知识都是错误的。我希望 Dudesville Hurynnx 写一个解释。
    • @Christopher:是的,我希望带有凭据的 ProcessStartInfo 与 runas 具有相同的效果。它似乎有效,但我还不太满意。
    • 抱歉,说得太早了。该过程从我当前的用户开始,忽略动词。
    猜你喜欢
    • 2013-09-18
    • 2012-01-17
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多