Я создал именованный канал, который будет запускаться автоматически при запуске. Код службы Windows выглядит следующим образом:
public class Service : ServiceBase {
public Service() {}
protected override void OnStart(string[] args) {
StartNamedPipeServer();
}
private async void StartNamedPipeServer() {
PipeSecurity ps = new PipeSecurity();
ps.AddAccessRule(
new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),
PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance,
AccessControlType.Allow));
using (
NamedPipeServerStream serverPipe = new NamedPipeServerStream(
"myPipe",
PipeDirection.InOut,
1,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous,
1024,
1024,
ps)) {
try {
await Task.Factory.FromAsync(
(cb, state) => serverPipe.BeginWaitForConnection(cb, state),
ar => serverPipe.EndWaitForConnection(ar),
null);
} catch(Exception e) {
log.Error("Error on Pipe creation.", e);
}
var reader = new StreamReader(serverPipe);
while ((line = reader.ReadLine()) != null) {
//... Do stuff with message and start again
}
}
StartNamedPipeServer();
}
}
Все это прекрасно работает на большинстве клиентов. У меня есть клиент Windows 10 1909, при котором запуск сервера выдает ошибку в eventLog Windows
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name=".NET Runtime" />
<EventID Qualifiers="0">1026</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2020-02-27T10:10:43.912981400Z" />
<EventRecordID>3932</EventRecordID>
<Channel>Application</Channel>
<Computer>XXXXXX</Computer>
<Security />
</System>
- <EventData>
<Data>Anwendung: LSGService.exe Frameworkversion: v4.0.30319 Beschreibung:
Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.Security.Principal.IdentityNotMappedException
bei System.Security.Principal.NTAccount.Translate(System.Security.Principal.IdentityReferenceCollection, System.Type, Boolean)
bei System.Security.Principal.NTAccount.Translate(System.Type)
bei System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(System.Security.AccessControl.AccessControlModification, System.Security.AccessControl.AccessRule, Boolean ByRef)
bei System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(System.Security.AccessControl.AccessRule)
bei System.IO.Pipes.PipeSecurity.AddAccessRule(System.IO.Pipes.PipeAccessRule)
bei MyService.Service+<StartNamedPipeServer>d__7.MoveNext()
bei System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_1(System.Object)
bei System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
bei System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
bei System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
bei System.Threading.ThreadPoolWorkQueue.Dispatch() bei System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(
</Data>
</EventData>
</Event>
У кого-нибудь есть идея, в чем причина?