2016-09-13 8 views
2

通常の人のアカウントから管理者権限でバッチファイルを実行する必要があるアプリケーションを開発しています。私がコンピュータの管理者アカウントにログオンしているのに、管理者権限のない「テストアカウント」にログオンしていると、すべてうまく動作します。 管理者アカウントにログオンするには、App.configファイルからすべての情報 が必要です。C#の標準アカウントから管理者としてバッチファイルを実行する

私の最初の試みは、StartInfoを使ってceratinユーザー(管理ユーザー)としてプロセスを実行することでした。私は

p.StartInfo.Verb = "runas"; 

でプロセスを実行した場合しかし、私は、runasコマンドが機能するためにはtrueに

p.StartInfo.UseShellExecute = true; 

を設定する必要があります。私がそうなら、私はこの例外を取得:

System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to start a process as a user. 

私はfalseにあるUseShellExecuteを変更するが、その後、私は「runasコマンド」でそれを実行するカント、それが管理priviledgesことなく処理を開始します。 runasは、UseShellExecuteの値 がtrueに設定されている場合にのみ機能します。この解決のための

コード:

string domain = config.AppSettings.Settings["domain"].Value; 
string user = config.AppSettings.Settings["user"].Value; 
string password = config.AppSettings.Settings["password"].Value; 

try 
{ 

     Process p = new Process(); 

     p.StartInfo.FileName = installationPath; 
     p.StartInfo.Verb = "runas"; 

     System.Security.SecureString ssPwd = new System.Security.SecureString(); 
     for (int x = 0; x < password.Length; x++) 
     { 
      ssPwd.AppendChar(password[x]); 
     } 

     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.UserName = user; 
     p.StartInfo.Password = ssPwd; 

     p.Start(); 

     cmdRun.Enabled = false; 

     p.WaitForExit(); 

} 
     catch (Exception exc) 
{ 

    Debug.WriteLine(exc); 

} 

私の2番目のオプションは、偽装を使用することでした。私は管理者ユーザーとしてコードにログオンし、プロセスを実行します。それはすべてうまく動作し、 にログオンし、WindowsIdentity.CurrentUser()を印刷しようとしましたが、コンピュータの管理者ユーザーの名前が表示されました。つまり、なりすまし が動作します。しかし、私はこの例外を取得します(「runasコマンド」を実行するために必要な)真としてあるUseShellExecuteでコードを実行すると:

A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll 
System.ComponentModel.Win32Exception: Unknown error (0xfffffffe) 
    at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) 
    at System.Diagnostics.Process.Start() 

そして、私は偽としてあるUseShellExecuteでそれを実行した場合、何も、例外なく、allsoなしインストールは起こりません。 UseShellExecuteをfalseに設定してrunasを使用することはできません。

このソリューションのためのコード:

string domain = config.AppSettings.Settings["domain"].Value; 
string user = config.AppSettings.Settings["user"].Value; 
string password = config.AppSettings.Settings["password"].Value; 

using (new Impersonation(domain, user, password)) 
{ 

    try 
    { 

     Process p = new Process(); 

     p.StartInfo.FileName = installationPath; 
     p.StartInfo.Verb = "runas"; 
     p.StartInfo.UseShellExecute = true; 

     p.Start(); 

     cmdRun.Enabled = false; 

     p.WaitForExit(); 

    } 
    catch (Exception exc) 
    { 

     Debug.WriteLine(exc); 

    } 
} 

私が欲しいのは、管理者として、バッチファイルを実行することですと、好ましくは、allso UACを無効にします。ユーザーのための円滑なインストール。 どうすれば実現できますか?

+1

特権アプリケーションを実行しなくてもUACをバイパスできれば、セキュリティホールのビットになります... –

+0

はい、同意しますが、私はuacを無効にする前に管理権限を持つユーザーを偽装しようとしています。とにかく、これは私の質問の主な焦点ではなく、最後には「できればすべてUACを無効にする」というメモだけだった。主な問題は、標準アカウントから管理者ユーザーとしてバッチファイルを実行することでした。私は設定ファイルにパスワード、ドメイン、ユーザー名を持っているので、それは可能なはずですが、コードで動作させることはできません。 – 3DPALM

答えて

0

UACを "やっている"方法は、バッチファイルを作成し、最高の権限(アクティブスケジュールなし)で実行するスケジュールされたタスクを作成することです。 次に、別のバッチファイルUACを完全に回避します。私は私が使用しています例を見つけることが、ここでは技術http://www.techrepublic.com/blog/windows-and-office/run-uac-restricted-programs-without-the-uac-prompt/

編集2について説明したリンクであることはできません :私の場合は を

は一例を見つけると

編集を更新しますフォルダ「UACWhiteList」でTeamViewStartDelayedUACという「最高の権限で実行する」というスケジュールされたタスクを作成してから、コマンドを実行しました。

runLine = "C:\Windows\System32\schtasks.exe /RUN /TN ""UACWhitelis\TeamViewStartDelayedUAC""" 

DIM MyShell 
Set MyShell = CreateObject("WScript.Shell") 

MyShell.Run runLine,1,false 
+0

これは、管理者アカウントからアプリケーションを起動する場合に適しています。しかし、標準のユーザーとして、それはショートカットを開始する作業doesnt? – 3DPALM

+0

この方法では、管理者として実行するようにタスクを設定する必要があります。ユーザーは権限を持たずにUACを呼び出すことなく「管理者」として起動できます(少なくともこれは私の典型的な使用ではありません。 UACを避ける方法は、ユーザーが私のために同じされている) – jonbdk

関連する問題