通过控制台和高级安装程序对“ netsh”调用的不同行为

时间:2018-12-06 11:30:30

标签: c# powershell netsh advanced-installer

在两个不同的环境中,要分别调用netsh会遇到问题。

在设置过程中,我们有必要将ssl证书绑定到特定端口。此安装过程(基于高级安装程序的setup.exe)可以手动执行,但通常在静默模式下运行。正在创建证书并将其存储在本地计算机上。之后,我们尝试通过以下方式绑定所述证书:

http add sslcert ipport=0.0.0.0:9001 certhash=B83C66C9C04F88680D3359E394F4ADA160AAA51B appid={02639b71-0935-35e8-9d1b-9dd1a2a34627} clientcertnegotiation=enable

安装程序为此(powershell)触发自定义功能:

Param([String]$appDir="")

Import-Module PKI
dir Cert:\LocalMachine\My
cd $appdir
.\Services\Crypto\OurCompany.Crypto.Installer.exe install silent
dir Cert:\LocalMachine\My

,后者将执行installer.exe。此文件的实现(大大简化):

static void Main(string[] args)
{
            ProcessStartInfo procInfo = new ProcessStartInfo()
            {
                WindowStyle = ProcessWindowStyle.Normal,
                FileName = "netsh.exe",
                Arguments = "http add sslcert ipport=0.0.0.0:9001 certhash=B83C66C9C04F88680D3359E394F4ADA160AAA51B appid={02639b71-0935-35e8-9d1b-9dd1a2a34627} clientcertnegotiation=enable",
                UseShellExecute = false,
                Verb = "runas",
            };

            var process = new Process();
            process.StartInfo = procInfo;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
            process.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.WaitForExit();

}

解决房间里的大象问题:installer.exe中的逻辑已在多个地方被多个应用程序使用,这就是为什么我们决定仅从Power Shell触发.exe的原因。我们以相同的方式触发了更多例程(插入证书,URL保留...)

在管理控制台中运行上述netsh命令已成功完成,因此使用提升的权限(右键单击鼠标,以管理员身份运行)直接从文件系统运行installer.exe也是如此。

以提升的权限手动触发setup.exe时,命令也正在执行,并且OutputDataReceived-delegate确认:

Das SSL-Zertifikat wurde erfolgreich hinzugefügt.

(在运行德语的操作系统上运行)

但是证书实际上未绑定到端口!除了成功消息外,没有创建其他日志(例如msi-logs,事件日志等)。

任何建议都值得赞赏。

0 个答案:

没有答案