windows - Få nuværende brugernavn fra et program startet som Local System Account

Indlæg af Hanne Mølgaard Plasc

Problem



Mit program er startet fra en tjeneste, der kører under Local System Account (en rigtig bruger er logget ind). Et af opgaverne i programmet er at gemme filer på en netværkssti, som skal indeholde det aktuelle brugernavn, f.eks. \server\storage\\%username\%, men problemet er, at jeg får navnet på systemkontoen i stedet for brugerkontoen, når jeg læser miljøvariablen:


Environment.GetEnvironmentVariable("username");


Er der en måde at få det korrekte brugernavn på i dette tilfælde?

Bedste reference


Min løsning var at finde ud af, hvilken bruger der startede explorer processen:


Kun fungerer, hvis du refererer til .NET System.Management biblioteket :


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


En anden mulighed er at analysere udgangen af ​​kommandoen qwinsta.

Andre referencer 1


Hvis du ikke tager nogen foranstaltninger for at starte dit program som en anden bruger (CreateProcessAsUser et al.), Så vil den køre som den samme bruger som opkaldsprogrammet.