У меня есть служба Windows с собственной REST-службой WCF, использующей HTTPS и сертификат. Все работает нормально, если я настраиваю сертификат вручную, запуская оболочку msdos с правами администратора и выполняя команду «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 и портом, когда он снова запустится.
Большое спасибо.