.Net SslStream在桌面中正常工作,但在会话0中不工作(Windows服务会话)

时间:2017-07-06 06:26:03

标签: c# .net tcp windows-services sslstream

我有这个代码,它通过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计算机上运行。

任何提示都受到高度赞赏。

1 个答案:

答案 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 thisthis < / p>

希望它有所帮助!