Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängig) ? (https://www.delphipraxis.net/46993-semaphore-mutex-systemweit-%3Dbenutzerkontenunabhaengig.html)

xineohp 4. Jun 2005 15:53


Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängig) ?
 
Hi,

Ich bräuchte ein Mutex/Semaphore, das systemweite Gültigkeit hat, d.h. es muss auch über Benutzerkonten(-Grenzen) hinweg gültig sein. Leider sind meine Erfahrungen zu diesem Thema recht gering und meine bisherigen Versuche mit den hier zu findenden Codebeispielen sind auch alle fehlgeschlagen(=haben nicht den gewünschten Erfolg gehabt).

MfG

Luckie 4. Jun 2005 16:15

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Was willst du erreichen? Wozu brauchst du das?

xineohp 4. Jun 2005 16:29

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Es handelt sich bei dem Ganzen um ein Steuerprogramm für meinen Router, das aus Performance-Gründen auf jedem PC nur einmal laufen sollte. Zum Starten steht es momentan im Autostartordner, wodurch es bei jedem Login eines Benutzers gestartet wird. Es würde aber reichen, wenn es nur bei ersten Mal gestartet wird und bei den folgenden Logins lediglich in den Vordergrund geholt wird.
Im Prinzip täte es auch eine Art Service mit Interface.

Ich bin für alle Lösungsvorschläge offen :mrgreen:

Olli 4. Jun 2005 19:36

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Zitat:

Zitat von xineohp
Hi,

Ich bräuchte ein Mutex/Semaphore, das systemweite Gültigkeit hat, d.h. es muss auch über Benutzerkonten(-Grenzen) hinweg gültig sein. Leider sind meine Erfahrungen zu diesem Thema recht gering und meine bisherigen Versuche mit den hier zu findenden Codebeispielen sind auch alle fehlgeschlagen(=haben nicht den gewünschten Erfolg gehabt).

Sowohl Mutexe als auch Semaphoren existieren systemweit. Du mußt also nichts extra tun um das zu erreichen. Auf Terminal-Servern gibt es noch die Besonderheit mit \Global und \Local, aber das ist dokumentiert.

Ich denke, daß du eventuell den DACL so setzen mußt, daß er auch Zugriff aus anderen Benutzerkonten erlaubt.

Nachtrag: Der NULL-DACL setzt eben nur Zugriff fürs aktuelle Benutzerkonto. Ergo mußt du den DACL selber setzen wie benötigt.

xineohp 4. Jun 2005 19:45

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Zitat:

DACL
Zitat:

NULL-DACL
?? Sagt mir leider gar nichts :pale:
Könntest du mir erläutern, was darunter zu verstehen ist?

Olli 4. Jun 2005 19:53

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Zitat:

Zitat von xineohp
Zitat:

DACL
Zitat:

NULL-DACL
?? Sagt mir leider gar nichts :pale:
Könntest du mir erläutern, was darunter zu verstehen ist?

DACL ist die Abkürzung für:
"Discretionary ACL"
Der DACL ist zuständig dafür, daß Zugriffe beschränkt oder freigegeben werden. Die Vergabe von Rechten ist viel feinkörniger als bei Standard-Unix, wo aber auch bereits Erweiterungen für ACLs existieren. ACLs kann man für so ziemlich jedes Objekt in Windows vergeben.

ACL wiederum heißt Access Control List. Neben dem DACL gibt es noch den SACL (System ACL, welcher zuständig ist für Zugriffsüberwachung).

Schau mal hier (C-Deklaration):
Code:
HANDLE CreateMutex(
  [color=red]LPSECURITY_ATTRIBUTES lpMutexAttributes,[/color]
  BOOL bInitialOwner,
  LPCTSTR lpName
);
Achte immer auf den Parameter mit den "Security Attributes". Dort übergibst du auch den DACL, SACL usw.

xineohp 4. Jun 2005 20:02

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
hm, Ich muss also den "benötigten" DACL an der rot markierten Stelle einsetzen, soweit so klar. Nur, wo krieg ich den her?

Olli 4. Jun 2005 21:22

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Zitat:

Zitat von xineohp
hm, Ich muss also den "benötigten" DACL an der rot markierten Stelle einsetzen, soweit so klar. Nur, wo krieg ich den her?

Tja, so trivial ist die Erstellung nicht, es sei denn man kann auf Windows 2000 aufwärts aufbauen. In letzterem Fall gibt es die SDDL (Security Descriptor Definition Language). Ansonsten mußt du quasi manuell den SD (Security Descriptor) basteln. Der besteht aus der SID (Security ID) des Eigentümers, dem SACL und dem DACL und, ich glaube, noch aus der SID der sog. (Primär-)Gruppe (für die Posix-Kompatibilität).

Um einen SD aufzubauen und alles was enthalten ist, gibt es eine ganze Litanei and Funktionen, die erst ab Windows 2000 stabil benutzbar ist, wo wiederum die SDDL die bessere Lösung wäre. Unter anderem gibt es folgende Funktionen:

GetSecurityDescriptorControl, GetSecurityDescriptorDacl, GetSecurityDescriptorGroup, GetSecurityDescriptorLength, GetSecurityDescriptorOwner, GetSecurityDescriptorSacl, IsValidSecurityDescriptor, SECURITY_DESCRIPTOR, SetSecurityDescriptorDacl, SetSecurityDescriptorGroup, SetSecurityDescriptorOwner, SetSecurityDescriptorSacl

Es gibt kommerzielle Komponenten um die Arbeit mit SDs, ACLs usw. zu vereinfachen, freie sind mir nicht bekannt.
Ansonsten suche mal in der DP nach den Namen der Funktionen. Ich bin mir ziemlich sicher, daß unlängst ein Beispiel gepostet wurde, wo die Funktionen in Aktion waren. Ich denke von sakura. Ich werde selber nochmal suchen, ansonsten schreibe ihm mal eine PN. Kann mich aber auch täuschen.

xineohp 4. Jun 2005 22:09

Re: Semaphore / Mutex -- Systemweit(=benutzerkontenunabhängi
 
Oje, das kann ja was werden ... Ich befürchte das Ganze übersteigt meine Kenntnisse um einiges.
Ich glaube ich nehme es hin, dass die Performance etwas leidet und verzichte auf größere Eingriffe. In meinem Fall würden die Kosten den Nutzen weit übersteigen. Vielen Dank für deine Bemühungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz