【问题标题】:Get current username from a program started as Local System Account [closed]从作为本地系统帐户启动的程序中获取当前用户名[关闭]
【发布时间】:2011-04-05 09:49:07
【问题描述】:
我的程序是从在Local System Account 下运行的服务启动的(真实用户已登录)。该程序的任务之一是将文件存储在网络路径上,该路径应包含当前用户名,例如\\server\\storage\\%username%,但是问题是我读取环境变量的时候得到的是系统账号的名字而不是用户账号:
Environment.GetEnvironmentVariable("username");
在这种情况下有没有办法获得正确的用户名?
【问题讨论】:
标签:
windows
local-system-account
【解决方案1】:
我的解决方案是找出哪个用户启动了资源管理器进程:
仅当您引用 .NET System.Management 库时才有效:
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";
}
另一种可能性是解析qwinsta 命令的输出。
【解决方案2】:
如果您不采取任何措施以其他用户身份启动您的程序(CreateProcessAsUser 等),那么它将以与调用程序相同的用户身份运行。