NamedPipeClientStream не может получить доступ к NamedPipeServerStream в сеансе 0
У меня есть NamedPipeClientStream, который подключается к NamedPipeServerStream. Они обмениваются несколькими сообщениями, а затем NamedPipeClientStream закрывается, в то время как NamedPipeServerStream воссоздается и продолжает прослушивание клиентских каналов. (Я не мог сделать рабочую асинхронную серверную трубу, так что это какой-то гвоздь)
взаимодействие клиент-сервер отлично работает во время потоков моего клиента, запущенных из обычных сеансов пользователя.
но есть ситуация, когда клиент канал запускается из сеанса 0 на Win7 и win2008 server. Когда это происходит, у меня была ошибка в потоке клиента:
"доступ к пути запрещен"
в чем проблема? Как этого избежать?
Извините, я не могу рассказать вам больше об исключении. Только у меня есть это сообщение в журнале. И я не могу отладить свою программу от нулевого сеанса, не так ли?
код потока сервера:
PipeSecurity ps = new PipeSecurity();
System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);
PipeAccessRule par = new PipeAccessRule(sid, PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(par);
pipeClientConnection = new NamedPipeServerStream(General.PIPENAME, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, General.BUFFERSIZE, General.BUFFERSIZE, ps);
Console.Write("Waiting for client connection...");
IAsyncResult result = pipeClientConnection.BeginWaitForConnection(OnPipeConnected, pipeClientConnection);
может, что-то не так с настройки безопасности?
и код клиента:
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", General.PIPENAME, PipeDirection.InOut))
{
try
{
Console.WriteLine("Connecting with pipe...");
pipeStream.Connect(General.CONNECTIONTIMEOUT);
Console.WriteLine("Pipe connection established");
//..do something..
}
//...
}
сервер запускается как служба windows в LocalSystem. Клиент - это простое консольное приложение. Он запущен другим приложением, запущенным из службы LocalSystem.
1 ответов
похоже, проблема была в настройках безопасности здесь:
System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);
должно быть :
System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.WorldSid, null);
спасибо Майкрософт communnity