从提升的子进程获取错误和标准输出

本文关键字:取错误 标准输出 获取 子进程 | 更新日期: 2023-09-27 18:12:31

我创建了一个进程处理程序,它启动两种类型的进程:使用管理员用户名和密码进行提升另一个运行正常,没有任何用户名和密码输入。

我正在努力弄清楚如何从提升的过程中获得输出。启动该进程的应用程序不需要Admin凭据来运行,管理凭据被输入到一个单独的加密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类启动该进程,无论是否向该进程添加了管理凭据。这个impersonator类什么也没做,只是告诉我没有访问权限,尽管我是在冒充管理员…

我从这里得到了Impersonator类:

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

那么,我如何从一个未被提升的进程中获得标准和错误的输出?

从提升的子进程获取错误和标准输出

你不能通过黑客攻击系统和/或利用一些漏洞和/或编写一些内核级代码(即驱动程序)来绕过这些安全措施…

想想这种可能性意味着什么——高程将变得毫无意义,因为在一个系统中总有一些高程可以被这种方法操纵……所以答案是NO…

您应该能够做的是将输出重定向到文件(例如> C:'MyLog.txt),然后读取该文件…

考虑另一种不需要这种访问的设计…