如何在启动 net.exe 时向用户显示错误代码

Posted

技术标签:

【中文标题】如何在启动 net.exe 时向用户显示错误代码【英文标题】:How to get error code shown to user when starting net.exe 【发布时间】:2020-01-23 16:38:10 【问题描述】:

我正在尝试使用 .Net 进程重置 Windows 本地管理员密码,如下所示:

int retVal;
string pEXE = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\cmd.exe";
if (System.IO.File.Exists(pEXE))

    Process P = new Process();
    P.StartInfo.FileName = pEXE;
    P.StartInfo.Arguments = "/c " + "net user lAdmin 123";
    P.StartInfo.UseShellExecute = false;
    P.StartInfo.CreateNoWindow = true;
    P.StartInfo.RedirectStandardError = true;
    P.StartInfo.RedirectStandardOutput = true;
    P.StartInfo.RedirectStandardInput = true;
    P.Start();
    P.WaitForExit();
    retVal = P.ExitCode;

在两种不同的情况下: [1] 如果本地管理员帐户的用户名是“lAdmin”,则退出代码将为“0”,这意味着成功。 [2] 如果本地管理员帐户用户名是“管理员”,则退出代码将为“2”,即“系统找不到指定的文件”,但是如果我在 Windows 命令提示符下运行此命令,则会收到错误代码“2221”是“找不到用户名”。

【问题讨论】:

【参考方案1】:

net.exe 只是向用户显示错误代码“2221”,以便用户可以在文档中查找此代码,但它不会使代码“2221”对操作系统可用。

在命令提示符下执行时返回的错误码也是2,之后使用echo %errorlevel%可以看到。


您可以尝试捕获命令的输出,然后解析输出以检索显示给用户的错误代码。但是解析该文本不会很可靠,因为该文本在操作系统的不同语言中明显不同,并且还可能在未来的 Windows 更新中发生变化。

一些示例代码,您将如何做到这一点(未使用非欧洲版本的 Windows 进行测试)

int retVal;
string pEXE = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\cmd.exe";
if (System.IO.File.Exists(pEXE))

    Process P = new Process();
    P.StartInfo.FileName = pEXE;
    P.StartInfo.Arguments = "/c " + "net user lAdmin 123";
    P.StartInfo.UseShellExecute = false;
    P.StartInfo.CreateNoWindow = true;
    P.StartInfo.RedirectStandardError = true;
    P.StartInfo.RedirectStandardOutput = true;
    P.StartInfo.RedirectStandardInput = true;
    P.Start();
    P.WaitForExit();
    retVal = P.ExitCode;

    if(retVal != 0)
    
        // Error code was returned, get text output
        string outputText = P.StandardError.ReadToEnd();

        // Parse error code from text output
        Match match = Regex.Match(outputText, "NET HELPMSG (?<code>\\d+)");
        if(match != null)
        
            string code = match.Groups["code"].Value;
            retVal = int.Parse(code);
        
    


    MessageBox.Show(retVal.ToString());

【讨论】:

以上是关于如何在启动 net.exe 时向用户显示错误代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在后台处理交易时向用户显示“您的付款正在处理...”页面?

如何在登录时向HttpContext用户添加声明

C# 如何将代码附加到正在运行的 .NET .EXE 的末尾,最好是从该 .EXE 内部?

如何在启动应用程序时锁定方向并在导航到 Viewcontroller 时解锁它

Delphi 程序终止时向用户显示消息

将项目拖动到它时向 Navigationviewitem 添加显示