web-dev-qa-db-ja.com

管理者権限でのcmdコマンドの実行

Windowsフォームのバックグラウンドでコマンド**cd..**を実行するにはどうすればよいですか? (つまり、ユーザーはそれを見ることができません)

ありがとう。

14
user1547766

System.Diagnostics.Processを参照してください http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.aspx

これもありますSOこれとまったく同じ質問に対する答え:https://stackoverflow.com/a/1469790/25882

例:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
startInfo.Verb = "runas";
process.StartInfo = startInfo;
process.Start();
15
Chris Andrews

WindowStyleHiddenMaximized、またはMinimizedのプロセスの開始時に使用するウィンドウの状態を示すNormalに加えて、プロセスの開始に必要な情報を持つ新しいSystem.Diagnostics.ProcessStartInfoを初期化できます。あなたのケースでは、これをHiddenに設定します。これにより、開始されるプロセスは、ユーザーとの間で入力を受け取ったり、ユーザーへの出力を表示したりできなくなります。

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd..
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo

スクリーンショット

次のスクリーンショットは、アプリケーションによって開始された1つのプロセスを示すタスクマネージャを表しています。ただし、そのウィンドウは表示されません。

The process is running without showing its Window

通知:アプリケーションを閉じても、開始されたプロセスは終了しません。

さらに、プロセスを管理者として実行するには、プロセス開始情報のVerbプロパティをrunasに設定します。

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd..
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden
myProcessInfo.Verb = "runas"; //The process should start with elevated permissions
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo

通知:ユーザーアカウント制御を有効にしている場合、このプロセスを呼び出そうとしたアプリケーションが昇格したアクセス許可で実行されていなかった場合、最初に昇格したアクセス許可でプロセスを開始するように求められることがあります。

プロンプトをスキップしたい場合は、メインアプリケーションを昇格したアクセス許可で開始できるようにする必要があると思います。これを行うには、アプリケーションのマニフェストを開き、次の行が追加されていることを確認する必要があります

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

これは、昇格したアクセス許可でのみ起動するようにアプリケーションに指示するだけです。したがって、管理者としてプロセスを呼び出す場合、プロセスの呼び出し元は管理者の下で実行されているため、プロンプトは表示されません。

おかげで、
これがお役に立てば幸いです:)

16

スニペットはユーザーには「見えない」だけでなく、出力をリダイレクトするため、なんらかの方法で使用できます(必要だと思います)。

string output = null;

try
{
    ProcessStartInfo ps = new ProcessStartInfo("cmd");
    ps.Arguments = "/c cd.."; 
    ps.UseShellExecute = false;

    // Redirects the standard output so it reads internally in out program
    ps.RedirectStandardOutput = true;

    // Starts the process
    using (Process p = Process.Start(ps))
    {
        // Reads the output to a string
        output = p.StandardOutput.ReadToEnd();

        // Waits for the process to exit must come *after* StandardOutput is "empty"
        // so that we don't deadlock because the intermediate kernel pipe is full.
        p.WaitForExit();
    }
}
catch
{
    // manage errors
}
finally
{
if(output != null)
{
     // Process your output
}
}
0
Salaros