使用UAC以其他用户身份运行应用程序

时间:2012-11-16 22:08:30

标签: c#

我正在尝试编写一个运行Draytek VPN客户端作为另一个用户的应用程序,因为我不希望用户拥有管理员密码,并且他们的帐户是标准用户。但是由于我尝试过的两种实现中的错误,我无法使其正常工作。

以下是我尝试过的一些示例代码:

System.Security.SecureString ss = new System.Security.SecureString();
foreach (var c in "password")
{
    ss.AppendChar(c);
}

Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.WorkingDirectory = "c:\\";
process.StartInfo.FileName = @"C:\Program Files (x86)\DrayTek\Smart VPN Client\SmartVPNClient.exe";
process.StartInfo.Verb = "runas";
process.StartInfo.UserName = "testUser";
process.StartInfo.Password = ss;
process.StartInfo.UseShellExecute = false;
process.Start();

我收到错误:请求的操作需要提升。

我还尝试使用问题Impersonating a Windows user中的代码进行模拟。我的电话会议实施如下:

  using ( new Impersonator( "testUser", "", "password" ) )
  {

      Process process = new Process();
      process.StartInfo.UseShellExecute = true;
      process.StartInfo.WorkingDirectory = "c:\\";
      process.StartInfo.FileName = @"C:\Program Files (x86)\DrayTek\Smart VPN Client\SmartVPNClient.exe";
      process.StartInfo.Verb = "runas";
      process.Start();
  }

然而,运行上述代码的错误是未知错误(0xfffffffe)

如果需要,我可以提供更多错误详情。

1 个答案:

答案 0 :(得分:0)

关于第一种方法:

您获得“请求的操作需要提升”的事实意味着当前运行您的应用程序的用户不是以管理员身份运行,或者Draytek VPN客户端需要提升才能正常运行。

我对您的代码进行了以下更改:

  1. 删除了不需要的行process.StartInfo.Verb = "runas";
  2. 将文件名更改为测试控制台应用程序而不是Draytek VPN客户端。
  3. 并按如下方式进行测试:

    Windows 7

    • 以默认级别启用UAC的管理员身份登录
    • 以默认级别启用UAC的受限用户身份登录

    Windows XP

    • 以管理员身份登录
    • 以受限用户身份登录

    所有测试都有效。在任务管理器中,我可以看到测试控制台在正确的帐户下运行。

    以下是我用来运行测试的代码:

    static void Main(string[] args)
            {
                Console.Write("User name:");
                string user = Console.ReadLine();
                Console.Write("Password:");
                string password = Console.ReadLine();
                Console.Write("File name:");
                string fileName = Console.ReadLine();
    
                System.Security.SecureString ss = new System.Security.SecureString();
                foreach (var c in password)
                {
                    ss.AppendChar(c);
                }
    
                Process process = new Process();
                process.StartInfo.UseShellExecute = true;
                process.StartInfo.WorkingDirectory = "c:\\";
                process.StartInfo.FileName = fileName;
                process.StartInfo.Verb = "runas";
                process.StartInfo.UserName = user;
                process.StartInfo.Password = ss;
                process.StartInfo.UseShellExecute = false;
                process.Start();
    
                Console.ReadKey();
            }
    

    您是否尝试过运行其他应用程序而不是Draytek VPN Client作为测试?