如何用C#执行带密码输入的runas命令启动指定程序
Automating
runas /netonly with C# (Including Password Input) Got it, let's tackle this problem. You want to automate running that runas /netonly command with C#, including passing the password without manual input. Here's a reliable approach using the System.Diagnostics.Process class, which lets us control the command's input/output streams.
Step-by-Step Implementation
First, here's a complete code example that does exactly what you need. I'll break down the key parts after:
using System; using System.Diagnostics; using System.Text; class RunAsNetOnlyAutomation { static void Main(string[] args) { // Configure your command parameters here string domainUsername = @"domain\username"; string targetExePath = @"C:\Users\user\Documents\Visual Studio 2015\Projects\samplePACE\samplePACE\bin\Debug\samplePACE.exe"; string exeArguments = "brown"; string userPassword = "YourSecurePassword"; // ⚠️ Don't hardcode this in production! // Build the full runas command string string runasCommand = $"runas /netonly /user:{domainUsername} \"{targetExePath} {exeArguments}\""; // Set up the process start info to control cmd.exe ProcessStartInfo processStartInfo = new ProcessStartInfo { FileName = "cmd.exe", Arguments = $"/c {runasCommand}", UseShellExecute = false, // Critical for redirecting input/output RedirectStandardInput = true, // Allows us to send the password RedirectStandardOutput = true, // Optional: capture output for debugging RedirectStandardError = true, // Optional: capture errors CreateNoWindow = true, // Optional: hide the command prompt window StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8 }; using (Process cmdProcess = Process.Start(processStartInfo)) { // Send the password to the runas command's input prompt cmdProcess.StandardInput.WriteLine(userPassword); cmdProcess.StandardInput.Flush(); cmdProcess.StandardInput.Close(); // Read output and error (remove if you don't need logging) string commandOutput = cmdProcess.StandardOutput.ReadToEnd(); string commandError = cmdProcess.StandardError.ReadToEnd(); // Wait for the process to finish cmdProcess.WaitForExit(); // Print results (for debugging) Console.WriteLine("Command Output:"); Console.WriteLine(commandOutput); if (!string.IsNullOrEmpty(commandError)) { Console.WriteLine("\nCommand Errors:"); Console.WriteLine(commandError); } } } }
Key Details to Note
UseShellExecute = false: This is non-negotiable. Disabling shell execution lets us redirect the standard input stream, which is how we send the password torunas.cmd.exe /c: We run therunascommand throughcmd.exebecauserunasis a shell built-in, and usingcmdensures consistent behavior across Windows versions.- Password Security: Never hardcode passwords in your source code! In production, use secure storage options like:
- Environment variables
- Encrypted configuration files (like
appsettings.jsonwith .NET's configuration providers) - Prompting the user for the password at runtime with masked input (you can use
Console.ReadKeyto hide typed characters)
/netonlyBehavior: Remember that this parameter makes the target app use the domain account only for network operations—local system access will still use the account running your C# program. Make sure this aligns with your needs.
Potential Gotchas
- UAC Prompts: If the target executable requires elevated privileges, Windows might show a UAC prompt. This can break the automation since the password input won't reach the UAC dialog. You'll need to adjust UAC settings or ensure your C# program runs with sufficient permissions.
- Encoding Issues: Setting
StandardOutputEncodingandStandardErrorEncodingto UTF8 prevents garbled text in output/error logs, especially if your app or command uses non-ASCII characters.
内容的提问来源于stack exchange,提问作者Alkondan Balaji
相关产品推荐
相关产品推荐

