Я создал обработчик процессов, который запускает два типа процессов:
Тот, который повышен с именем пользователя и паролем администратора
Другой, который работает нормально без ввода имени пользователя и пароля.
Я изо всех сил пытаюсь понять, как я могу получить результат от повышенного процесса. Приложение, которое запускает процесс, не требует запуска учетных данных администратора, учетные данные администратора вводятся в отдельный зашифрованный 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/
Итак, как мне получить стандартный вывод ошибок с процессом с повышенными правами в процессе, который не имеет повышенных прав?