从以本地系统帐户启动的程序中获取当前用户名

时间:2011-04-05 09:49:08

标签: windows username local-system-account

我的程序是从Local System Account下运行的服务启动的(真实用户已登录)。该程序的任务之一是在网络路径上存储文件,该路径应包含当前用户名,例如\\server\\storage\\%username%,但问题是当我读取环境变量时,我得到系统帐户的名称而不是用户帐户:

Environment.GetEnvironmentVariable("username");

在这种情况下,有没有办法获得正确的用户名?

2 个答案:

答案 0 :(得分: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命令的输出。

答案 1 :(得分:0)

如果您没有采取任何措施以不同的用户身份启动您的程序(CreateProcessAsUser等),那么它将作为与调用程序相同的用户运行。