Получите ошибку и стандартный вывод от повышенного дочернего процесса - PullRequest
3 голосов
/ 26 октября 2011

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

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

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

public bool CreateProcessWithAdminRights(string filePath, string commandlineArgument, bool log)
{
    if (!string.IsNullOrEmpty(filePath) && !string.IsNullOrEmpty(commandlineArgument) && _user.UserDataExsists())
    {
        var securePassword = GetSecureString(_user.Password);

        ToolsProvider.Logger.Debug("Creating process with the following filepath: {0} and commandline argument: {1}", filePath, commandlineArgument.Replace(_user.Password, "<REPLACED>"));
        ToolsProvider.Logger.Info("Creating Process with admin rights for {0} against {1}", _user.Name );

        _proc = new Process
        {
            StartInfo =
            {
                FileName = @filePath,
                Arguments = commandlineArgument,
                ErrorDialog = false,
                RedirectStandardInput = false,
                RedirectStandardOutput = _log,
                RedirectStandardError = _log,
                UseShellExecute = false,
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden,
                UserName = _user.Name,
                Password = securePassword,
                Domain = _user.Domain
            }
        };
        _proc.ErrorDataReceived += ErrorDataReceived;
        _proc.OutputDataReceived += OutputDataReceived;
        return true;
    }
    return false;
}

Процесс запущен с использованием:

private bool StartProcess()
{
    if (_proc != null)
    {
        try
        {
            _proc.Start();
            _proc.BeginErrorReadLine();
            _proc.BeginOutputReadLine();
            _proc.WaitForExit();
            _proc.CancelOutputRead();
            _proc.CancelErrorRead();

            if (_standardOutput.Length > 2)
            {
                // use writeline, the builder itself will add the DEBUG / info tag
                ToolsProvider.Logger.WriteLine(_standardOutput.ToString());
            }

            if (_errorBuilder.Length > 2)
            {
                // use writeline, the builder itself will add the DEBUG / info tag
                ToolsProvider.Logger.WriteLine(_errorBuilder.ToString());
            }

            return true;
        }
        catch (Win32Exception ex)
        {
            ToolsProvider.Logger.Error(
                "Missing file while trying to run an action: " + _proc.StartInfo.FileName, ex.Message);
        }
    }
    ToolsProvider.Logger.Error("");
    return false;
}

Я попытался запустить процесс с использованием класса Impersonator, с добавлением и добавлением учетных данных администратора. Класс подражателя ничего не делал, но сказал мне, что у меня не было доступа, хотя я выдавал себя за администратора ...

Я получил класс Имитатора здесь:

http://freshclickmedia.co.uk/2008/11/programmatic-impersonation-in-c/

Итак, как мне получить стандартный вывод ошибок с процессом с повышенными правами в процессе, который не имеет повышенных прав?

1 Ответ

1 голос
/ 26 октября 2011

Вы не можете, кроме как взломать систему и / или использовать какую-то ошибку и / или написать некоторый код уровня ядра (т.е. драйвер), чтобы обойти эти меры безопасности ...

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

Что вы должны сделать, это перенаправить вывод в файл (например, > C:\MyLog.txt), а затем прочитать этот файл ...

Подумайте о другом дизайне, который не требует такого доступа ...

...