Hallo,
ich habe einen WindowsDienst, welcher über IPC statusinfos an den Client sendet.
Wenn ich statt einem Dienst eine ganz normale Form mache, funktioniert alles ohne problem.
Beim WindowsDienst bekomme ich beim Verbinden am Client aber immer "Zugriff verweigert".
Nun habe ich schon gegoogelt, und bin zu der Info gelangt dies geschieht, da Server und Client unterschiedliche Anmeldungen haben.
Nur funktionieren sämtliche Lösungen diesbezüglich nicht bei mir 🙁
So erstelle ich den Server:
private IpcServerChannel myChan;
private ServerObject sm;
SecurityIdentifier Sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
NTAccount Account = (NTAccount)Sid.Translate(typeof(NTAccount));
// need this or we can't use delegates and remoting.
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider
{
TypeFilterLevel =
System.Runtime.Serialization.Formatters.
TypeFilterLevel.Full
};
System.Collections.Hashtable properties = new System.Collections.Hashtable();
props["portName"] = "Testprogramm";
props["name"] = "Testprogramm";
props["exclusiveAddressUse"] = false;
props["tokenImpersonationLevel"] = TokenImpersonationLevel.Delegation;
props["authorizedGroup"] = Account.Value;
props["impersonate"] = true;
props["secure"] = true;
myChan = new IpcServerChannel (properties, serverProv);
ChannelServices.RegisterChannel(myChan, true);
RemotingConfiguration.RegisterWellKnownServiceType(typeof (ServerObject), "ClientGUI.rem",
WellKnownObjectMode.Singleton);
sm = (ServerObject)Activator.GetObject(typeof(ServerObject), "ipc://Testprogramm/ClientGUI.rem");
sm._sendText("Server gestartet");
Wenn ich das so mache, stürtz der Server schon bei sm._sendText ab
Fehlermeldung:
Fehler beim Verarbeiten der Anforderung auf dem Server: System.Security.SecurityException: Ein anonymer Sicherheitsebenentoken kann nicht geöffnet werden.
bei System.Security.Principal.WindowsIdentity.GetCurrentInternal(TokenAccessLevels desiredAccess, Boolean threadOnly)
TypeFilterLevel.Full hab ich aber eingbaut.
Weiss von euch vielleicht jemand, warum das so nicht funktioniert?
Bin für jede noch so kleine Idee dankbar 🙂
Tobias
Hallo Balu,
soweit ich weiß gilt bei IPC-Channeln und Diensten ein besonderer Zugriffsschutz. Um den Zugriff zu erlauben muss wie in deinem Beispiel unten bereits geschehen der Parameter authorizedGroup angegeben werden. Nur muss dort eine Gruppe und kein Benutzer angegeben werden.
Willst du zum Beispiel den Zugriff nicht einschränken kannst du auf einem deutschen Betriebssystem folgende Zeile verwenden:
props["authorizedGroup"] = "Jeder";