![]() |
Semaphore für alle Benutzer erzeugen
Hi,
Ich verwende eine Semaphore um gewisse Hintergrundaktivitäten meiner Software genau einmal pro Rechner laufen zu lassen. Das funktioniert auch wunderbar, solange alle Programminstanzen mit dem selben Benutzer laufen. Meine Semaphore müsste also für jedes Benutzerkonto lesbar sein. Bei meinen Recherchen bin ich dabei auf den Typ TSecurityAttributes und den SECURITY_DESCRIPTOR gestoßen und hab rausgefunden, dass das Ganze mit einer null-ACL lösbar sein sollte. Mein Versuch sieht so aus:
Delphi-Quellcode:
... was aber nicht funktioniert. Der selbe Benutzer kann die Semaphore wie gehabt auslesen, aber ein zweiter Benutzer reagiert nicht darauf. Mir ist auch aufgefallen, dass SetSecurityDescriptorDacl fehlschlägt, GetLastError aber 0 (Der Vorgang wurde erfolgreich beendet) zurückliefert. Woran liegts? Oder muss ich das ganz anders anpacken (keine leere ACL)?
var desc: SECURITY_DESCRIPTOR;
aSA : TSecurityAttributes; begin aSA.nLength := SizeOf(TSecurityAttributes); aSA.bInheritHandle := true; aSa.lpSecurityDescriptor := @desc; if InitializeSecurityDescriptor(aSa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION) then begin if SetSecurityDescriptorDacl(aSa.lpSecurityDescriptor, True, nil, False) then begin ToErrorLog('Fehler: ' + GetLastErrorText(GetLastError)); end; end else begin ToErrorLog('Fehler'); end; VSemaphorHandle := CreateSemaphore( @aSA, 0, 1, PChar(SemaphorName + DDBBase.GetDBText)); if (VSemaphorHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then begin VDoClientRoles := False; CloseHandle(VSemaphorHandle); VSemaphorHandle := 0; ... end else begin ... Aktivitäten ausführen end; grüße, daniel |
Re: Semaphore für alle Benutzer erzeugen
Zitat:
If lpName matches the name of an existing event, mutex, or file-mapping object, the function fails and the GetLastError function returns ERROR_INVALID_HANDLE. This occurs because event, mutex, semaphore, and file-mapping objects share the same name space. Das ist nicht der Fehler, den du auswertest. Gruss Reinhard |
Re: Semaphore für alle Benutzer erzeugen
Hallo Reinhard,
Danke für die Antwort. Ich hab das mal so getestet, dass ich beide Fehler-Meldungen auswerte. Das hat dann aber auch nicht wie gewünscht funktioniert. Folgende Zeile aus der Delphi Hilfe hat mir dann aber weitergeholfen: Zitat:
Delphi-Quellcode:
grüße, daniel
procedure TFrmMain.CheckClientRoleSemaphore;
var desc: SECURITY_DESCRIPTOR; aSA : TSecurityAttributes; begin aSA.nLength := SizeOf(TSecurityAttributes); aSA.bInheritHandle := true; aSa.lpSecurityDescriptor := @desc; InitializeSecurityDescriptor(aSa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(aSa.lpSecurityDescriptor, True, nil, False); VSemaphorHandle := CreateSemaphore( @aSA, 0, 1, PChar('Global\' + SemaphorName + DDBBase.GetDBText)); if (GetLastError in [ERROR_ALREADY_EXISTS, ERROR_INVALID_HANDLE]) then begin if VSemaphorHandle <> 0 then begin CloseHandle(VSemaphorHandle); VSemaphorHandle := 0; end; VDoClientRoles := False; tmrCheckInstance.Enabled := True; end else begin VDoClientRoles := True; TRoleManager.Instance.LadeRollenAufgaben(RollenAktionErzeugt); //neu zeichnen InvalidateRect(0, nil, true); end; end; |
Re: Semaphore für alle Benutzer erzeugen
Zitat:
Übrigens hat bei einer NULL-DACL, jeder VOLLEN Zugriff und kann daher alles damit anstellen. |
Re: Semaphore für alle Benutzer erzeugen
Zitat:
Wie würde die DACL aussehen, wenn jeder lesenden Zugriff hätte, aber nur der Ersteller die Semaphore wieder schließen könnte? |
Re: Semaphore für alle Benutzer erzeugen
siehe
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz