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

RunAs 實作方式比較:ProcessStartInfo 完整解決方案(三)

     編輯:關於C語言

前兩種方式的缺陷

Process.Start 配合 runas 動詞或命令列 runas /user:... 僅能在第一個提示輸入使用者名稱,密碼仍需手動輸入,無法在單一命令/程式碼中完整提供認證,導致無法全自動化。

runas 命令列說明

完美方案:ProcessStartInfo 設定 UserName/Password


using System;
using System.Diagnostics;
using System.Security;

namespace MainTest
{
    public class ProcessUserLogonHelper
    {
        // 範例調用
        private void InvokeExample()
        {
            var phelper = new ProcessUserLogonHelper();
            Process pro = phelper.CreateProcessWithUserToken(
                @"C:\Program Files\Internet Explorer\iexplore.exe",
                "bestreme.com", "chdwu", "************");
            pro.Start();
        }

        // 完整參數版本
        public Process CreateProcessWithUserToken(string appPath, string domain, string userName, string password)
        {
            Process pro = new Process();
            ProcessStartInfo info = new ProcessStartInfo(appPath);
            info.UseShellExecute = false;          // 必須為 false 才能指定認證
            info.UserName = userName;
            info.Domain = domain;
            info.Password = ToSecureString(password);
            info.WorkingDirectory = System.IO.Path.GetDirectoryName(appPath);
            pro.StartInfo = info;
            return pro;
        }

        // 僅本機帳號版本
        public Process CreateProcessWithUserToken(string appPath, string userName, string password)
        {
            return CreateProcessWithUserToken(appPath, "", userName, password);
        }

        private SecureString ToSecureString(string password)
        {
            SecureString ss = new SecureString();
            foreach (char c in password) ss.AppendChar(c);
            return ss;
        }
    }
}

關鍵點

  • UseShellExecute = false:必要條件,否則無法設定 UserName/Password。
  • SecureString:密碼以加密字串儲存於記憶體,提升安全性。
  • 支援網域帳號 (Domain) 與本機帳號。
  • 回傳 Process 物件,呼叫端可決定何時 Start(),彈性最高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved