从非管理员用户程序启动管理工具

时间:2015-03-25 11:18:34

标签: .net security uac

我目前正在迁移应用程序以使其与UAC兼容。此应用程序提供给非管理员用户,以便他们可以执行非常集中的管理任务(重新启动一项服务,运行安装程序更新...)。

我小心翼翼地红Chris Jackson's blog entry并创建了一个引导程序:

  • 申请A(提升不相关)
  • 启动引导程序的
  • CreateProcessWithLogonW (使用管理员帐户)( asInvoker
  • 启动应用程序B的
  • ShellExecute(Ex) requireAdministrator

以下是我根据自己的情况调整此博客的方法:

  1. 应用程序A使用以下调用启动引导程序:

    var processStartInfo = new ProcessStartInfo("ApplicationA")
    {
        WorkingDirectory = "Path to Application A",
        Arguments = "bootstrapper",
        UseShellExecute = false,
        UserName = credentials.UserName,
        Password = credentials.Password,
        Domain = credentials.Domain,
        CreateNoWindow = true
    };
    var p = Process.Start(processStartInfo);
    
  2. Bootstrapper与Application A的可执行文件相同,并以清单文件中定义的 asInvoker 高程启动。它以一个参数开始,该参数告诉Program.cs该进程已在引导程序模式下启动。它没有使用ShellExecute模式(如博客中所述......因此我们可以使用其他帐户启动该过程)。这是Program.cs中启动应用程序B的代码片段:

    if (Environment.GetCommandLineArgs().Any(a => "bootstrapper".Equals(a)))
    {
        var processStartInfo = new ProcessStartInfo(fileName)
        {
            WorkingDirectory = Path.GetDirectoryName(fileName),
            Verb = "runas", // Tried with or without runas...
            UseShellExecute = true
        };
        var p = Process.Start(processStartInfo);
    }
    
  3. 应用程序B通过其清单文件以 requireAdministrator 启动。

  4. 它在Windows Server 2012 R2上运行正常,但它不在Windows 7下,除非我与管理员帐户同时打开其他会话。这意味着除非我有两个活动会话(一个用于当前用户,一个用于管理员用户),引导程序在Windows 7上调用ShellExecute时失败,但在Windows Server 2012 R2上调用。以下是我在Windows 7下获得的错误消息:

    System.ComponentModel.Win32Exception (0x80004005): Unknown error (0xfffffffe)
       à System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
       à System.Diagnostics.Process.Start()
       à System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
       à ProgramA.Program.StartBootstrapper() dans c:\...\Program.cs:ligne 82
    

    您知道是否有必须启用的魔术政策规则?或者如果我直接使用Win32 API,那么会有一个标志可以解决这个问题吗?

0 个答案:

没有答案