通常の人のアカウントから管理者権限でバッチファイルを実行する必要があるアプリケーションを開発しています。私がコンピュータの管理者アカウントにログオンしているのに、管理者権限のない「テストアカウント」にログオンしていると、すべてうまく動作します。 管理者アカウントにログオンするには、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を無効にします。ユーザーのための円滑なインストール。 どうすれば実現できますか?
特権アプリケーションを実行しなくてもUACをバイパスできれば、セキュリティホールのビットになります... –
はい、同意しますが、私はuacを無効にする前に管理権限を持つユーザーを偽装しようとしています。とにかく、これは私の質問の主な焦点ではなく、最後には「できればすべてUACを無効にする」というメモだけだった。主な問題は、標準アカウントから管理者ユーザーとしてバッチファイルを実行することでした。私は設定ファイルにパスワード、ドメイン、ユーザー名を持っているので、それは可能なはずですが、コードで動作させることはできません。 – 3DPALM