Как запустить приложение Windows с повышенными правами в качестве другого пользователя за один шаг? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть приложение, которое требует прав администратора.Он имеет манифест с необходимыми настройками безопасности:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

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

Модуль запуска содержит следующий параметр в своем манифесте:

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />

При вызове целевого приложения я могу переключать пользователя или , повышать контекст, но не оба одновременно.Это моя (упрощенная) попытка:

public static Process RunElevatedIn(string userDomain, string userName, string userPassword, string workingDirectory, string programPath, string arguments)
{
    if (userName != null)
    {
        // try to start with technical user credentials
        try
        {
            var processStartInfo = new ProcessStartInfo
            {
                UseShellExecute = false,
                FileName = programPath,
                Arguments = arguments,
                UserName = userName,
                Password = userPassword,
                Domain = userDomain,
                WorkingDirectory = workingDirectory,
            };
            return Process.Start(processStartInfo);
        }
        catch (Exception exception)
        {
            // Log error and continue with default UAC method
        }
    }

    // try elevation using UAC
    {
        var processStartInfo = new ProcessStartInfo
        {
            UseShellExecute = true,
            FileName = programPath,
            Arguments = arguments,
            Verb = "runas",
            WorkingDirectory = workingDirectory,
        };
        return Process.Start(processStartInfo);
    }
}

При запуске этого кода непривилегированным пользователем я получаю сообщение об ошибке (из первой catch -классы):

System.ComponentModel.Win32Exception (0x80004005): the requested operation requires elevated privileges*

*) переведено из локализованного сообщения об ошибке (я ненавижу это!)

Я полагаю, это связано с переключением на нужного пользователя, но не в состоянии подняться в контексте администратора.Я надеялся, что указание правильного манифеста заставило Windows запустить UAC для запроса подтверждения о повышении прав у пользователя.

Согласно моим результатам поиска, большинство обращений касалось людей, пытающихся полностью обойти UAC.Это не моя цель.У пользователя все еще может быть запрошен запрос на повышение прав, но его нельзя запрашивать для каких-либо учетных данных.

Дальнейшие исследования

Я тестировал свою программу запуска с regedit.exe в качестве цели,regedit.exe имеет следующий манифест и позволяет его запускать обычным пользователям:

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

При использовании переключателя пользователя в моей панели запуска происходит сбой (непривилегированный), несмотря на то, что пользователь находится в группе «Администратор».Когда я вручную запускаю regedit.exe как привилегированный пользователь, я должен подтвердить UAC.

Тот же тест с calc.exe (никаких специальных привилегий не требуется) работает нормально.Вывод:

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

Я начинаю считать, что невозможно переключить пользователя и для повышения привилегий через UAC в одномвызов.Но я не вижу , почему это было бы невозможно или запрещено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...