我有这个代码,它通过TCP建立一个SSL加密流到服务器:
var client = new TcpClient(host, port);
var stream = new SslStream(client.GetStream(), false, ValidateServerCertificate);
var clientCertificates = new X509CertificateCollection {clientCertificate};
stream.AuthenticateAsClient(host, clientCertificates, sslProtocols, false);
var isAuthenticated = stream.IsAuthenticated; //This is true in both Console and Windows Service
var lenghtBytes = new byte[4];
int read = 0;
while (read < 4)
{
read = read + stream.Read(lenghtBytes, read, 4 - read);
}
当作为常规控制台应用程序作为Administrator
用户运行时,它可以正常工作。
然而,当注册并作为Windows服务(在会话0中)运行时,相同的代码会在while loop
中循环读取流的前4个字节,作为Local System
用户
在调试时,作为Console应用程序,while loop
在第一个循环中接收所有4个字节并在第一个循环后立即退出循环,但是当作为Windows服务运行时,流不会接收任何字节(read
总是0)并且只是永远循环。
代码在.Net Framework v4.6.2上安装了最新更新的Windows Server 2012 R2计算机上运行。
任何提示都受到高度赞赏。
答案 0 :(得分:1)
当您作为本地系统运行时,ssl握手可能会因根证书可用性,代理设置等而出现错误,因为这些是用户特定于Windows的。如果没有调试问题,将很难理解问题所在。
您可以使用sys internal utility PsExec在本地系统下运行任何进程。您必须使用的命令是psexec -s <programpath>
C:\windows\system32>psexec -s cmd.exe
PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\windows\system32>whoami
nt authority\system
一旦你在本地系统下运行你的工具,你可以调试它以找出发生了什么。如果这没有帮助,你也可以捕获system.net this或this < / p>
希望它有所帮助!