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

How to get error code shown to user when starting net.exe

我正在尝试使用 .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] 如果本地管理员帐户用户名是 'Administrator' 退出代码将是 '2' 即 'The system cannot find the file specified',但是如果我 运行 在 Windows 命令提示符下我得到错误代码“2221”,即 'The user name could not be found'.

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());
}