首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

RunAs 以指定身分執行程式:命令列、ProcessStartInfo、Win32 API 三種 C#/Python 實作

     編輯:關於C#

場景

自動化測試需切換使用者身分啟動瀏覽器 (如 IE) 存取內部網站,避免手動輸入帳密。

方法一:命令列 runas.exe (半自動,需手動輸入密碼)


# 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` 安全設計不支援命令列傳遞密碼,必須互動輸入,無法全自動化。

方法二:ProcessStartInfo + SecureString (全自動,推薦)


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();

關鍵細節

  1. UseShellExecute = false:啟用使用者語境啟動。
  2. WorkingDirectory:必須指定,否則可能「目錄不存在」失敗。
  3. SecureString:密碼逐字元加入,減少記憶體明文殘留。
  4. 域帳號可用 `domain\\user` 格式放入 `UserName`,`Domain` 留空。

方法三:Win32 API (CreateProcessWithLogonW / CreateProcessAsUser) — 進階/特殊需求

適用:需載入使用者完整設定檔、非互動式服務帳號、Token 複製等進階場景。潛在風險:Token 權限提升、憑證洩漏、UAC 互動複雜。下篇將詳細剖析。


建議:優先使用 `ProcessStartInfo` 方案,安全、支援自動化、API 乾淨。僅在極特殊需求 (如 Batch 服務啟動互動桌面程式) 才考慮 Win32 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved