自動化測試需切換使用者身分啟動瀏覽器 (如 IE) 存取內部網站,避免手動輸入帳密。
# Python
import os
os.system(r'runas /user:user@domain.com "C:\Program Files\Internet Explorer\iexplore.exe"')
# C#
Process.Start("runas", @"/user:user@domain.com ""C:\\Program Files\\Internet Explorer\\iexplore.exe""");
缺點: `runas` 安全設計不支援命令列傳遞密碼,必須互動輸入,無法全自動化。
public class ProcessUserLogonHelper {
public Process CreateProcessWithUserToken(
string appPath, string domain, string userName, string password) {
var psi = new ProcessStartInfo(appPath) {
UseShellExecute = false, // 必須 false 才能指定使用者
UserName = userName,
Domain = domain, // 或 UserName = "domain\\user"
Password = ToSecureString(password),
WorkingDirectory = Path.GetDirectoryName(appPath)
};
return new Process { StartInfo = psi };
}
public Process CreateProcessWithUserToken(string appPath, string userName, string password)
=> CreateProcessWithUserToken(appPath, "", userName, password);
private static SecureString ToSecureString(string plain) {
var ss = new SecureString();
foreach (char c in plain) ss.AppendChar(c);
return ss;
}
}
// 使用
var helper = new ProcessUserLogonHelper();
var proc = helper.CreateProcessWithUserToken(
@"C:\Program Files\Internet Explorer\iexplore.exe",
"corp.domain.com", "testuser", "P@ssw0rd");
proc.Start();
UseShellExecute = false:啟用使用者語境啟動。WorkingDirectory:必須指定,否則可能「目錄不存在」失敗。SecureString:密碼逐字元加入,減少記憶體明文殘留。適用:需載入使用者完整設定檔、非互動式服務帳號、Token 複製等進階場景。潛在風險:Token 權限提升、憑證洩漏、UAC 互動複雜。下篇將詳細剖析。
建議:優先使用 `ProcessStartInfo` 方案,安全、支援自動化、API 乾淨。僅在極特殊需求 (如 Batch 服務啟動互動桌面程式) 才考慮 Win32 API。