C# 4.0 如何从C#(桌面应用程序)安装Windows服务
我有一个名为MyCustomUpdater.exe的程序,可以下载windows服务zip文件并将其解压缩 提取文件夹中包含MyWindowsServices.exe文件 我想从MyCustomUpdater.exe安装这些MyWindowsServices.exe 我使用下面提到的代码C# 4.0 如何从C#(桌面应用程序)安装Windows服务,c#-4.0,windows-services,installation,C# 4.0,Windows Services,Installation,我有一个名为MyCustomUpdater.exe的程序,可以下载windows服务zip文件并将其解压缩 提取文件夹中包含MyWindowsServices.exe文件 我想从MyCustomUpdater.exe安装这些MyWindowsServices.exe 我使用下面提到的代码 Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.WindowStyle =
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.Verb = "runas";
process.Start();
if (process != null)
{
process.StandardInput.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe /u \"" + "E:\Testing\MV.AutoUpdateWindowsService.exe" + "\"");
process.StandardInput.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe \"" + "E:\Testing\MV.AutoUpdateWindowsService.exe" + "\"");
process.StandardInput.Close();
}
process.Close();
但它不会安装windows服务
此代码只需打开一个空白的黑色命令提示窗口;没有进一步的执行
我还尝试在中运行windows服务安装命令
process.StartInfo.Arguments
我在visual studio 2013中使用了dot net framework 4.5
我为MyCustomUpdater.exe添加app.manifest文件 包括app.manifest后,我设置了它。 右键单击程序>属性>应用程序>资源>清单[单击下拉列表] 然后选择应用程序清单 在那之后,我有了机会密码
Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe", _FilePath);
这个很好用
但是,对于卸载过程
Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe", "/u " + _FilePath);
或
不起作用
下面是app.manifest文件的代码
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
<defaultAssemblyRequest permissionSetReference="Custom" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
</asmv1:assembly>
帮帮我
谢谢当您可以直接执行安装可执行文件时,以这种方式使用
cmd.exe
似乎有点不寻常。但是如果您真的想使用cmd.exe
和STDIN重定向。然后需要通过“/K”开关使用交互模式
有关详细信息,请参见此。您应该以管理员身份运行试图调用
installutil.exe
的程序,然后直接运行installutil.exe
,而不需要cmd
的帮助。此外,我发现PInvoke更稳定(请参阅,)。完成了
在app.manifest的帮助下,程序以管理员模式运行。
[代码如上所述]
下面是在“静默”模式下安装windows服务的代码
谢谢大家。嗨。您希望使用标准输入将exe传递到
cmd.exe
,而不是直接执行installutil.exe(即在StartInfo.FileName
)有什么原因吗?我添加了process.OutputDataReceived+=(s,e)=>\u ILog.Fatal(@“OutputDataReceived:+e.Data”)代码>也可以,但无法获得输出它失败了吗?在InstallUtil.InstallLog
文件中是否有任何线索?我添加app.manifest以在管理模式下运行我的应用程序。然后进行过程。开始安装。
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
<defaultAssemblyRequest permissionSetReference="Custom" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
</asmv1:assembly>
Process _Process = new Process();
_Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_Process.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe";
_Process.StartInfo.Arguments = "/u \"" + _FilePath + "\"";
_Process.Start();
System.Threading.Thread.Sleep(8000);
_Process.Close();
_Process = new Process();
_Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_Process.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe";
_Process.StartInfo.Arguments = _FilePath;
_Process.Start();
_Process.Close();