如何在启动时向用户显示错误代码 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());
}
我正在尝试使用 .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());
}