dies ist die erste öffentliche Bekanntmachung für etwas das ich mittlerweile fast ein Jahr entwickle. Zudem habe ich mich nach einigem Gerangel entschieden sie als OpenSource freizugeben. Dies geschieht aus der Hoffnung, dass Andere dazukommen und Verbesserungen beitragen oder sogar weitere Klassen hinzufügen. Die Veröffentlichung geschieht jedoch mit der ausdrücklichen Bitte die Bibliothek als ganzes zu verwenden und sie nicht als Selbstbedienungsladen zu sehen.
Was ist JEDI Windows API (JWA)?
Die JWA ist eine Bibliothek, die versucht soviele original Windows Header Dateien (C-Header) wie möglich nach Delphi zu konvertieren.
Was ist JEDI Windows Security Code Library (JWSCL) ?
Die JWSCL ist eine reine Klassenbibliothek, die die Programmierung mit der Windows API (in C geschrieben) vereinfachen soll.
Darunter fallen derzeit folgende Konstrukte:
*Erkennung der Windows Version
*Token
**Impersonation (Personifizierung)
**Benutzerlogin
*SID
*Access Control List
*Security Descriptor (Sicherheitsdeskriptor)
**Owner, Group, DACL, SACL
*WindowStation
*Desktop
*LSA (Teile)
*Rights mapping
*Gesicherte Objekte z.B. Dateien, Registry (+Vererbung), aber auch alle anderen Handles
*Credentials (Login Dialog)
*Verschlüsselung (MS Crypt API)
*Known SIDs
*Privilegien
*Security Dialogs (Sicherheitsdialog, wie man ihn bei der Dateisicherheit des Explorers sieht)
*Terminal Sessions
*Unicode + Ansicode
*Vista Elevation
*Vista Integrity Level
In Entwicklung:
*Terminal Server (u.a. Session shadowing) (40%)
*Secure Private Objects (Sicherung von benutzerdefinierten Strukturen mit Sicherheitsdeskriptor + opt. Vererbung) (20%)
*Group Policy (0%)
*Active Directory (0%)
*und weitere
Die JWSCL gibt es derzeit im BETA Status über Subversion (Versionsverwaltung) von SourceForge. Sie ist unter der GPL (wenn auch noch nicht in der Dokumentation erwähnt) oder MPL als OpenSource freigegeben.
Zusätzlich gibt es noch eine erweiterte Version der JEDI API Lib, die in demselben Subversion Repository liegt. Sie findet Verwendung in der JWSCL.
(Anonymer Zugriff)
Die URL ist über ein SVN Client, wie Tortoise SVN zu verwenden.
Auf allgemeine Anfrage ist nun der Download des aktuellen Subversion Repository rev#30 - Download von SF.net möglich. Das Archiv hat denselben Inhalt, wie ein Checkout über SVN.
Die JWSCL verwendet die neue JEDI API Lib (JWA). Dazu muss die JWA als Paket kompiliert werden.
1. Öffne die Projektgruppe im Ordner jwaapi\trunk\Packages, was zu deiner Delphiversion passt. Oder wenn nicht vorhanden, verwende eine ältere Version.
2. Kompiliere alle Pakete. Die DCU Dateien werden in einem Ordner "Bin" gespeichert. Dieser ist nochmals in vier weitere Unterordner aufgeteilt, die die verschiedenen Versionsarten (Debug/Release, Dynamic/Static) repräsentieren.
Die Dateien "JwaWindows.dcu" und "JwaVista.dcu" sind dann die entscheidenden Teile.
3. Kopiere dir den Pfad-Text von einem dieser vier Ordner. Ich empfehle für die Entwicklung Static\Debug. Dieser Pfad wird der Suchpfad für JediAPI DCU Dateien in deinen neuen Projekten.
Diese Vorgehensweite ist empfehlenswert im Gegensatz zu der direkten Einbindung der Quelldateien. In diesem Fall müsste bei jeder Projekterzeugung alle Jedi API Lib Dateien erneut kompiliert werden - das dauert.
Die Verwendung der JWSCL ist dann einfach. Man muss nur den Suchpfad des eigenen Projekts noch durch den Pfad zur Quelle "jwscl\trunk\source" erweitern.
So, das wars für die Vorbereitung.
Einige Beispiele sind bereits in den Ordnern. Der Rest ist durch Ausprobieren erfahrbar

Zum BETA Status:
BETA Status bedeutet für die JWSCL, dass es noch viele unentdeckte Fehler gibt. Daher ist es nicht ratsam blindlings die Bibliothek in wichtigen Projekten einzusetzen. Ich verbiete es jedoch nicht! Ich werde mich jedoch bemühen, Fehler so gut wie möglich zu korrigieren. Ich rufe aber inständig andere Entwickler auf mich bei der Arbeit zu unterstützen. Tester suche ich daher weniger als Helfer.
Es gibt einige Probleme bei der Ausführung von Beispielen. Diese funktionieren nicht so, wie sie sollten. Das ACL Editor WinStation Beispiele, zum Beispiel, hat wohl ein Problem mit der Rücksprungaddresse (zerstörtert Stack?). Ich weiß einfach nicht warum.
Es gibt im Moment noch kein FreePascal-Paket oder Projekt, weil ich nocht nicht wirklich zufrieden mit der Funktionsweise unter Freepascal/Lazarus bin. Ich bin auch einfach nicht erfahren genug und habe nicht genügend Zeit, um JWA und JWSCL unter Freepascal und Delphi 5-2007 vollständig zum Laufen zu bringen.
Vielleicht finde ich hier jemand, der das übernehmen will? Es sollte etwas einfacher sein, da die Bibliotheken in FP kompilierbar sind.
Der folgende Quelltext demonstriert wie man die maximalen Zugriffsrechte einer Datei bekommt.
Code: Alles auswählen
program ReadFileSecurity;
{$APPTYPE CONSOLE}
uses
SysUtils,
Dialogs,
Controls,
JwaWindows,
JwsclTypes,
JwsclExceptions,
JwsclConstants,
JwsclMapping,
JwsclVersion,
JwsclProcess,
JwsclSid,
JwsclAcl,
JwsclCredentials,
JwsclDescriptor,
JwsclToken,
JwsclKnownSid,
JwsclAccounts,
JwsclSecureObjects,
JwsclStrings;
function CheckAccessToFile(
DesiredAccess: DWORD; const FileName: WideString): Boolean;
var FileObject : TJwSecureFileObject;
begin
FileObject := TJwSecureFileObject.Create(FileName);
try
result := FileObject.AccessCheck(DesiredAccess);
finally
FileObject.Free;
end;
end;
function CheckMaximumAccessToFile(const FileName: WideString): DWORD;
var FileObject : TJwSecureFileObject;
PrivilegeSet: TJwPrivilegeSet;
AccessStatus: boolean;
begin
FileObject := TJwSecureFileObject.Create(FileName);
try
FileObject.AccessCheck(
MAXIMUM_ALLOWED,//DesiredAccess: TJwAccessMask;
PrivilegeSet,//out PrivilegeSet: TJwPrivilegeSet;
result,//out GrantedAccess: TJwAccessMask;
AccessStatus,//out AccessStatus: boolean;
nil//const ClientToken: TJwSecurityToken = nil);
);
finally
PrivilegeSet.Free;
FileObject.Free;
end;
end;
var AccessMask : DWORD;
FileName : String;
begin
FileName := ParamStr(1);
if Length(FileName) = 0 then
FileName := ParamStr(0);
writeln('Check access for '+FileName);
try
if CheckAccessToFile(FILE_ALL_ACCESS,FileName) then
writeln('Full control allowed')
else
writeln('Full control denied');
except
On E : Exception do
Writeln(E.Message);
end;
try
AccessMask := CheckMaximumAccessToFile(FileName);
writeln('Maximum access possible: ['+TJwSecurityFileMapping.MapAccessMaskToString(AccessMask)+']');
except
On E : Exception do
Writeln(E.Message);
end;
Writeln('[Hit return]');
readln;
end.