Получить текущее имя пользователя из программы, запущенной как учетная запись локальной системы

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

Environment.GetEnvironmentVariable("username");

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


person xsl    schedule 05.04.2011    source источник


Ответы (2)


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

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

person xsl    schedule 05.04.2011

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

person Luke    schedule 05.04.2011