0

ユーザーに管理者パスワードを持たせたくないため、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();
  }

ただし、上記のコードの実行によるエラーはUnknown error (0xfffffffe)です。

必要に応じて、エラーの詳細を提供できます。

4

1 に答える 1

0

最初のアプローチについて:

「要求された操作には昇格が必要です」というメッセージが表示されるという事実は、現在アプリケーションを実行しているユーザーが管理者として実行されていないか、Draytek VPN クライアントを適切に実行するために昇格が必要であることを意味します。

コードに次の変更を加えました。

  1. process.StartInfo.Verb = "runas";不要な行を削除しました。
  2. ファイル名を Draytek VPN Client ではなくテスト コンソール アプリケーションに変更しました)。

次のようにテストしました。

ウィンドウズ7

  • UAC がデフォルト レベルで有効になっている管理者としてログインしている
  • デフォルト レベルで UAC が有効になっている制限付きユーザーとしてログイン

WindowsXP

  • 管理者としてログインしました
  • 制限付きユーザーとしてログインしました

すべてのテストが機能しました。タスク マネージャーで、テスト コンソールが正しいアカウントで実行されていることを確認できました。

テストの実行に使用したコードは次のとおりです。

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 の代わりに別のアプリケーションを実行してみましたか?

于 2012-11-23T00:59:20.410 に答える