我正在开发一些应该像托管面板一样用于自我部署应用程序的东西。我创建了一个将文件名和参数作为参数的方法,并且在执行时应该在面板网页上给出输出。
这是我的方法;
private string ExecuteCmd(string sysUser, SecureString secureString, string argument, string fileName)
{
using (Process p = new Process())
{
p.StartInfo.FileName = fileName;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UserName = sysUser;
p.StartInfo.Password = secureString;
p.StartInfo.Arguments = argument;
p.Start();
p.WaitForExit();
StreamReader sr = p.StandardOutput;
p.Close();
string message = sr.ReadToEnd();
return message;
}
}
当我使用此方法在 IIS 上创建站点时(使用 appcmd.exe),当我在命令提示符上执行此可执行文件时,我会得到所有输出。但是当涉及到 dnscmd.exe 在 DNS 上创建条目时,我什么也得不到!StandardOutput 只是空的。我使用管理员凭据来执行这些可执行文件。顺便说一句,我在 Windows Server 2012 Standart 上。我还没有在 Server 2008 R2 上测试过这种方法,但我相信结果会是一样的。
看到 appcmd 和 dnscmd 可执行文件在同一方法上的行为不同,这对我来说有点奇怪。
我在这里想念什么?
谢谢!
编辑:StandardOutput 和 StandardError 都为 dnscmd.exe 返回错误。
Edit2:我将 ReadLine() 更改为 ReadToEnd()。那是我在玩耍和尝试时改变的东西。原始代码有 ReadToEnd()。
Edit3:带有文件路径和参数的完整方法。那是针对 IIS 的,它显示没有问题的输出;
private string ExecuteAppCmd(string sysUser, SecureString secureString)
{
using (Process p = new Process())
{
p.StartInfo.FileName = @"C:\Windows\System32\inetsrv\APPCMD.EXE";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.UserName = sysUser;
p.StartInfo.Password = secureString;
p.StartInfo.Arguments = " list site domain.com";
p.Start();
p.WaitForExit();
StreamReader sr = p.StandardOutput;
p.Close();
string message = sr.ReadToEnd().Replace("\n", "<br />");
return message;
}
}
“appcmd list site domain.com”在命令提示符上显示 domain.com 的 iis 站点配置。如果 domain.com 不在 iis 中,则会显示错误。无论哪种方式,都有一个输出,并且可以正常使用此代码。
这是针对 dnscmd 的。这个在 asp.net 页面上完成了这项工作,但没有使用 StandardOutput 显示它的输出。但是,输出显示在命令提示符下。
private string ExecuteDnsCmd(string sysUser, SecureString secureString)
{
using (Process p = new Process())
{
p.StartInfo.FileName = @"C:\Windows\System32\DNSCMD.EXE";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.UserName = sysUser;
p.StartInfo.Password = secureString;
p.StartInfo.Arguments = " /zoneadd domain.com /primary";
p.Start();
p.WaitForExit();
StreamReader sr = p.StandardError;
p.Close();
string message = sr.ReadToEnd().Replace("\n", "<br />");
return message;
}
}