如何在启动 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 时向用户显示错误代码的主要内容,如果未能解决你的问题,请参考以下文章
如何在后台处理交易时向用户显示“您的付款正在处理...”页面?
C# 如何将代码附加到正在运行的 .NET .EXE 的末尾,最好是从该 .EXE 内部?