2017-03-14 5 views
1

私はこのような状況に問題があります。 私は2つのプログラムを作った:C#プログラムは管理者権限を持つ別のプログラムをどのように実行できますか?

最初の1だけでは、管理者provilegesを立ち上げたりされなかったと言って出力を印刷し、秒1、最初のプログラムを実行します管理者特権を使用し、UACを使用しないでください。問題は、2番目のプログラムがadmin権限で最初に起動できないということです。理由は分かりません。 これは私のコードです:最初のプログラムの

コード:2番目のプログラムの

// This only prints if you start as administrator or not. 
bool isElevated; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
Console.WriteLine("I got admin privileges?: "+isElevated); 

コード:

// This execute the first program with admin privileges without UAC 
string username = "myuser"; 
SecureString userpass = new SecureString(); 
userpass.AppendChar('m'); 
userpass.AppendChar('y'); 
userpass.AppendChar('p'); 
userpass.AppendChar('a'); 
userpass.AppendChar('s'); 
userpass.AppendChar('s'); 

Process program = new Process(); 
program.StartInfo.UserName = username; 
program.StartInfo.Password = userpass; 
program.StartInfo.FileName = "Path/First_program.exe"; 
program.StartInfo.UseShellExecute = false; 
program.Start(); 

PD:私は、ユーザーにしたくありませんUACを開きます。つまり、私はすでにユーザー名とパスワードを挿入しています。 ありがとうございます。

+0

私の知る限り、あなたはUACをそのように迂回することはできません。実行中のプログラムに管理者権限がない場合、呼び出されたプログラムはUACを起動する管理者権限を要求する必要があります。 – itsme86

+0

あなたはパスワード 'SecureString'を読み取り専用にしようとしましたか? –

+0

@BenVoigt、 "SecureString"はうまくいきます。間違ったパスワードを書き込むと、例外がスローされます。 – suffuko

答えて

2

あなたは答えの半分を持っています。残りの半分は、プログラムが高い特権で実行されることを要求しなければならないということです。既定では、Windowsプログラムは、ユーザーの実際のアクセス許可レベルに関係なく、「基本」信頼レベルで実行されます。行政権限にアクセスするには、プログラムが標高を要求しなければなりません。定義にはUACが関与します。

ProcessStartInfoの動詞runasを使用するか、いずれかのアプリケーションのマニフェストで昇格されたアクセス許可をrequireAdministratorと指定することで、あなたのようなプログラムが昇格を要求できます。いずれにしても、UACが有効になっている場合は、ユーザーにプロンプ​​トが表示されます。

これを回避する唯一の方法は、管理者権限で実行するようにservices.mscで構成された、Windowsサービスとして権限の昇格を必要とするプログラムを設定することです。この方法で実行するサービスのインストール/登録時には、UACプロンプトが1つ表示されます。その後、サービスはそれ以上のUACアクションを実行することなくそのタスクを実行できます。名前付きパイプからTCPのような真のネットワーク通信に至るまで、さまざまな通信技術を使用して、必要な処理を行うべきことを伝えることができます。

+3

サービスのややシンプルな代替方法は、特権のないユーザーがトリガーできるようにアクセス許可が設定されたスケジュール済みタスクです。それで、どんなコマンドでも実行できます。メインループにすべてのサービス管理機能を持つ必要はありません。 –

+1

@KeithS驚くべきことに、私はそれを念頭に置いておきます。 – suffuko

関連する問題