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

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

Environment.GetEnvironmentVariable("username");

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

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 команда.

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

Другие вопросы по тегам