Получить текущее имя пользователя из программы, запущенной с учетной записью локальной системы - PullRequest
0 голосов
/ 05 апреля 2011

Моя программа запускается из службы, которая работает под Local System Account (реальный пользователь вошел в систему).Одной из задач программы является сохранение файлов по сетевому пути, который должен содержать текущее имя пользователя, например, \\server\\storage\\%username%, но проблема в том, что я получаю имя системной учетной записи вместо учетной записи пользователя, когда читаю переменную среды:

Environment.GetEnvironmentVariable("username");

Есть ли способ получить правильное имя пользователя в этом случае?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Моим решением было выяснить, какой пользователь запустил процесс проводника:

Будет работать, только если вы ссылаетесь на библиотеку .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.

0 голосов
/ 05 апреля 2011

Если вы не принимаете никаких мер для запуска вашей программы от имени другого пользователя (CreateProcessAsUser и др.), То она будет работать от имени того же пользователя, что и вызывающая программа.

...