Get current username from a program started as Loc

2019-09-19 06:48发布

问题:

My program is started from a service that runs under the Local System Account (a real user is logged in). One of the tasks of the program is store files on a network path, which should contain the current username e.g. \\server\\storage\\%username%, but the problem is that I get the name of the system account instead of the user account when I read the environment variable:

Environment.GetEnvironmentVariable("username");

Is there a way to get the correct username in this case?

回答1:

My solution was to find out which user started the explorer process:

Will only work if you reference the .NET System.Management library:

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";
}

Another possibility is to parse the output of the qwinsta command.



回答2:

If you're not taking any measures to launch your program as a different user (CreateProcessAsUser et al.) then it's going to run as the same user as the calling program.