通常由我們寫好的程式來執行其它程式時,該程式的使用者名稱會跟我們的程式是同一個。但若是想要用不同的使用者名稱來執行的話,就得要在使用 Process.start() 時特別指定使用者名稱及密碼。
筆者就簡單的用 2 個 Button(按鈕) 來代表不同的使用者名稱,當按下指定使用者名稱時就利用該使用者身份來執行記事本
再來就是動作手程式的時間哩:但未了方便起見,所以筆者先匯入 System.Diagnostics、System.Security 及 System.ComponentModel 等命名空間
檢視原始碼 C#
1 2 3 4 | // 匯入 System.Diagnostics、System.Security 及 System.ComponentModel using System.Diagnostics; using System.Security; using System.ComponentModel; |
還記得在利用 Process 來執行其它外部程式有提到可以利用 Process.start(FileName, ar) 的方法來執行外部程式。那麼現在也是利用同樣方法,但我們需要提供更多的參數,例如:使用者名稱及密碼
檢視原始碼 C#
1 2 | // 程式的名稱, 使用者名稱, 密碼及網域 Process.Start(fileName, userName, password, domain); |
且使用者密碼型態是 SecureString 類別,所以筆者多寫一個轉把字串轉換成 SecureString 類別的方法
檢視原始碼 C#
1 2 3 4 5 6 7 8 9 | // 把 string 轉成 SecureString 類別 private SecureString ConvertStringToSecureString(string pwd) { SecureString passWord = new SecureString(); foreach (char c in pwd) { passWord.AppendChar(c); } return passWord; } |
準備好之後,先寫利用 Administrator 使用者名稱的功能:
檢視原始碼 C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void administratorBtn_Click(object sender, System.EventArgs e) { // 要執行的檔案名稱(必要時需要加讓路徑) string fileName = "notepad.exe"; // 指定要執行程式的使用者名稱 string userName = "administrator"; // 指定要執行程式的使用者名稱密碼,但需要是 SecureString 類別 SecureString password = ConvertStringToSecureString("administrator password"); try { // 執行程式 Process.Start(fileName, userName, password, null); } catch(Win32Exception win32Exception) { // 如果使用者名稱或密碼不正確時會丟出 Win32Exception MessageBox.Show("不正確的使用者帳號或密碼!", "錯誤"); } } |
只要在使用 start() 時特別指定使用者名稱跟密碼就能用該使用者的權限來執行了。Process 類別的用法可以參考:利用 Process 來執行其它外部程式
既然能寫用 Administrator 的話,那麼要寫下一個就是只要改使用者名稱跟密碼就可以了
檢視原始碼 C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void abgne_twBtn_Click(object sender, System.EventArgs e) { // 要執行的檔案名稱(必要時需要加讓路徑) string fileName = "notepad.exe"; // 指定要執行程式的使用者名稱 string userName = "abgne.tw"; // 指定要執行程式的使用者名稱密碼,但需要是 SecureString 類別 SecureString password = ConvertStringToSecureString("abgne.tw password"); try { // 執行程式 Process.Start(fileName, userName, password, null); } catch(Win32Exception win32Exception) { // 如果使用者名稱或密碼不正確時會丟出 Win32Exception MessageBox.Show("不正確的使用者帳號或密碼!", "錯誤"); } } |
當我們程式執行後,分別按下這兩個按鈕就會開啟兩個記事本,接著開啟工作管理員來查看
如果使用者名稱或是密碼有誤時,可是會丟出錯誤並跳出訊息
這樣是不是就能很輕易的指定使用者名稱來執行外部程式了呢!