Search code examples
windowslocal-system-account

Get current username from a program started as Local System Account


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?


Solution

  • 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.