我的程序是從運行於Local System Account
(真實用戶已登錄)的服務啓動的。該程序的任務之一是在網絡路徑上存儲文件,該文件應包含當前用戶名,例如\\server\\storage\\%username%
,但問題是,我得到的系統帳戶而不是用戶帳戶的名字,當我讀到的環境變量:從以本地系統帳戶啓動的程序獲取當前用戶名
Environment.GetEnvironmentVariable("username");
是否有一種方式來獲得在這種情況下正確的用戶名?
我的程序是從運行於Local System Account
(真實用戶已登錄)的服務啓動的。該程序的任務之一是在網絡路徑上存儲文件,該文件應包含當前用戶名,例如\\server\\storage\\%username%
,但問題是,我得到的系統帳戶而不是用戶帳戶的名字,當我讀到的環境變量:從以本地系統帳戶啓動的程序獲取當前用戶名
Environment.GetEnvironmentVariable("username");
是否有一種方式來獲得在這種情況下正確的用戶名?
我的解決辦法是找出哪個用戶啓動Explorer進程:
private static string GetExplorerUser()
{
var process = Process.GetProcessesByName("explorer");
return process.Length > 0
? GetUsernameByPid(process[0].Id)
: "Unknown-User";
}
private static string GetUsernameByPid(int pid)
{
var query = new ObjectQuery("SELECT * from Win32_Process "
+ " WHERE ProcessID = '" + pid + "'");
var searcher = new ManagementObjectSearcher(query);
if (searcher.Get().Count == 0)
return "Unknown-User";
foreach (ManagementObject obj in searcher.Get())
{
var owner = new String[2];
obj.InvokeMethod("GetOwner", owner);
return owner[0] ?? "Unknown-User";
}
return "Unknown-User";
}
另一種可能性是解析的輸出:
如果引用的.NETSystem.Management
庫
只會工作命令qwinsta
。
如果您沒有采取任何措施以不同的用戶身份啓動您的程序(CreateProcessAsUser等),那麼它將以與調用程序相同的用戶身份運行。