2017-07-06 54 views
1

我有這樣的代碼,通過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。

任何提示高度讚賞。

回答

1

當您作爲本地系統運行時,根據根證書的可用性,代理設置等,ssl握手可能會運行錯誤,因爲這些都是windows用戶特定的。如果不調試問題,將很難理解問題的位置問題。

您可以使用sys內部工具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 

一旦u必須運行在本地系統的工具,你可以對它進行調試,找出哪些是happening.If沒有幫助,你也可以拍攝system.net thisthis

希望它有幫助!

+0

如果我理解正確,handshake和tcp通信工作正常,因爲'stream.AuthenticateAsClient()'後有'stream.IsAuthenticated == true'。此外,我已經通過附加到服務並停止在斷點上來作爲服務運行時調試代碼。在我的調試場景中'psexec'做了什麼特別的事嗎? –

+0

不,它運行undr本地系統帳戶。因此,您可以重現問題和debug.Are您能夠在本地系統下運行時重現該問題? System.net跟蹤將爲您提供套接字上的原始數據詳細信息。否則,您可能需要捕獲[wireshark](https://www.howtogeek.com/104278/how-to-use-wireshark-to-capture- filter-and-inspect-packets /)trace –

+0

我會給Wireshark一個嘗試並將比較數據。 :) 感謝您指出了這一點。 –