我的程序是从运行于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等),那么它将以与调用程序相同的用户身份运行。