Home » 程式片段

[C#]指定使用者名稱來執行外部程式

通常由我們寫好的程式來執行其它程式時,該程式的使用者名稱會跟我們的程式是同一個。但若是想要用不同的使用者名稱來執行的話,就得要在使用 Process.start() 時特別指定使用者名稱及密碼。

筆者就簡單的用 2 個 Button(按鈕) 來代表不同的使用者名稱,當按下指定使用者名稱時就利用該使用者身份來執行記事本

dotnet_start_a_process_by_user_1

再來就是動作手程式的時間哩:但未了方便起見,所以筆者先匯入 System.DiagnosticsSystem.SecuritySystem.ComponentModel 等命名空間

1
2
3
4
// 匯入 System.Diagnostics、System.Security 及 System.ComponentModel
using System.Diagnostics;
using System.Security;
using System.ComponentModel;

還記得在利用 Process 來執行其它外部程式有提到可以利用 Process.start(FileName, ar) 的方法來執行外部程式。那麼現在也是利用同樣方法,但我們需要提供更多的參數,例如:使用者名稱及密碼

1
2
// 程式的名稱, 使用者名稱, 密碼及網域
Process.Start(fileName, userName, password, domain);

且使用者密碼型態是 SecureString 類別,所以筆者多寫一個轉把字串轉換成 SecureString 類別的方法

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 使用者名稱的功能:

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 的話,那麼要寫下一個就是只要改使用者名稱跟密碼就可以了

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("不正確的使用者帳號或密碼!", "錯誤");
	}
}

當我們程式執行後,分別按下這兩個按鈕就會開啟兩個記事本,接著開啟工作管理員來查看

dotnet_start_a_process_by_user_2

如果使用者名稱或是密碼有誤時,可是會丟出錯誤並跳出訊息

dotnet_start_a_process_by_user_3

這樣是不是就能很輕易的指定使用者名稱來執行外部程式了呢!

發表迴響