我有一个Windows服务,该服务带有使用HTTPS和证书的自托管WCF REST服务。如果我配置证书以管理员权限手动运行msdos shell并执行命令“ netsh http add sslcert ....”,则一切正常。如果我在Windows Form应用程序中使用以下代码执行命令,一切也将正常工作:
string arguments = String.Format("http add sslcert ipport={0}:{1} certstorename=MY certhash={2} appid={3}", ipAddress, tcpPort, Constants.CERTIFICATE_THUMBPRINT, guid);
var configProc = new ProcessStartInfo
{
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
RedirectStandardOutput = true,
UseShellExecute = false,
WorkingDirectory = @"C:\Windows\System32",
FileName = @"C:\Windows\System32\netsh.exe",
Verb = "runas",
Arguments = arguments
};
Process p = Process.Start(configProc);
与Windows服务完全相同的代码会产生错误1312“指定的登录会话不存在。它可能已经终止。”
两种情况之间唯一的显着区别是Windows用户执行代码:在不起作用的情况下(Windows服务)是LocalSystem。在可行的情况下,是具有管理员权限的普通用户。
仅提供给您完整的肖像:我需要以编程方式绑定/取消绑定证书,因为我需要使IP地址和端口可配置:可以停止该服务,更改侦听ip和端口,然后再次启动。当服务停止时,我将解除绑定证书,并在再次启动该服务时将其重新绑定到新的IP和端口上。
非常感谢您。