我有這樣的代碼,通過TCP建立SSL加密流給服務器:淨SslStream工作正常桌面而不是在會話0(Windows服務會話)
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
用戶的常規控制檯應用程序。
但是,相同的代碼在while loop
中保持循環,這意味着當應用程序註冊並作爲Windows服務(在會話0中)運行時讀取流的前4個字節,如Local System
用戶。
調試時,作爲控制檯應用程序,while loop
接收第一個循環中的所有4個字節並在第一個循環之後立即退出循環,但是當作爲Windows服務運行時,流不會接收任何字節(read
總是0),並且永遠持續循環。
代碼在安裝了最新更新的Windows Server 2012 R2計算機上運行.Net Framework v4.6.2。
任何提示高度讚賞。
如果我理解正確,handshake和tcp通信工作正常,因爲'stream.AuthenticateAsClient()'後有'stream.IsAuthenticated == true'。此外,我已經通過附加到服務並停止在斷點上來作爲服務運行時調試代碼。在我的調試場景中'psexec'做了什麼特別的事嗎? –
不,它運行undr本地系統帳戶。因此,您可以重現問題和debug.Are您能夠在本地系統下運行時重現該問題? System.net跟蹤將爲您提供套接字上的原始數據詳細信息。否則,您可能需要捕獲[wireshark](https://www.howtogeek.com/104278/how-to-use-wireshark-to-capture- filter-and-inspect-packets /)trace –
我會給Wireshark一個嘗試並將比較數據。 :) 感謝您指出了這一點。 –