home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 April
/
Chip_2002-04_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
NT.ZIP
/
NTFileSecurity.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-01-21
|
6KB
|
187 lines
unit NTFileSecurity;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NTSecurityDecls;
type
TNTFileSecurity = class(TComponent)
private
{ Private declarations }
FFileName:String;
FOwnerName:String;
FDomain:String;
FAccessMask:DWORD;
FError:DWORD;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property FileName:String read FFileName write FFileName;
property OwnerName:String read FOwnerName write FOwnerName;
property DomainName:String read FDomain write FDomain;
property AccessMask:DWORD read FAccessMask write FAccessMask;
property ErrorCode:DWORD read FError;
function GetAceCount:Integer;
function GetFileAce(Index:Integer):Pointer;
end;
procedure Register;
implementation
function TNTFileSecurity.GetAceCount:Integer;
var SecDescr:PSecurityDescriptor;
SizeNeeded:DWORD;
DaclPresent:BOOL;
DaclDefaulted:BOOL;
FilePacl:PACL;
AclInfo:ACL_SIZE_INFORMATION;
PaclInfo:Pointer;
dwAclInformationClass:TAclInformationClass;
begin
OwnerName:='';
DomainName:='';
FError:=0;
Result:=0;
If FFileName='' Then
Begin
Result:=-1;
Exit;
End;
GetMem(SecDescr,1024);
If Not GetFileSecurity(PChar(FFilename),DACL_SECURITY_INFORMATION,SecDescr,1024,SizeNeeded) Then
Begin
FreeMem(SecDescr);
Result:=-1;
FError:=GetLastError;
Exit;
End;
If Not GetSecurityDescriptorDacl(SecDescr,DaclPresent,FilePacl,DaclDefaulted) Then
Begin
FreeMem(SecDescr);
Result:=-1;
FError:=GetLastError;
Exit;
End;
PaclInfo:=@AclInfo;
dwAclInformationClass:=AclSizeInformation;
If Not GetAclInformation(FilePacl^,PaclInfo,SizeOf(ACL_SIZE_INFORMATION),dwAclInformationClass) Then
Begin
FreeMem(SecDescr);
Result:=-1;
FError:=GetLastError;
Exit;
End;
If DaclPresent Then Result:=AclInfo.AceCount;
FreeMem(SecDescr);
end;
function TNTFileSecurity.GetFileAce(Index:Integer):Pointer;
var SecDescr:PSecurityDescriptor;
SizeNeeded:DWORD;
SizeNeeded2:DWORD;
DaclPresent:BOOL;
DaclDefaulted:BOOL;
FilePacl:PACL;
AclInfo:ACL_SIZE_INFORMATION;
PaclInfo:Pointer;
dwAclInformationClass:TAclInformationClass;
pAce:Pointer;
OwnerName:PChar;
DomainName:PChar;
OwnerType:SID_NAME_USE;
AccountSID:PSID;
begin
FError:=0;
Result:=nil;
If FFileName='' Then
Begin
Result:=nil;
Exit;
End;
GetMem(SecDescr,1024);
If Not GetFileSecurity(PChar(FFilename),DACL_SECURITY_INFORMATION,SecDescr,1024,SizeNeeded) Then
Begin
FreeMem(SecDescr);
Result:=nil;
FError:=GetLastError;
Exit;
End;
If Not GetSecurityDescriptorDacl(SecDescr,DaclPresent,FilePacl,DaclDefaulted) Then
Begin
FreeMem(SecDescr);
Result:=nil;
FError:=GetLastError;
Exit;
End;
PaclInfo:=@AclInfo;
dwAclInformationClass:=AclSizeInformation;
If Not GetAclInformation(FilePacl^,PaclInfo,SizeOf(ACL_SIZE_INFORMATION),dwAclInformationClass) Then
Begin
FreeMem(SecDescr);
Result:=nil;
FError:=GetLastError;
Exit;
End;
If DaclPresent Then
Begin
If AclInfo.AceCount>0 Then
Begin
If Not GetAce(FilePacl^,Index,pAce) Then
Begin
FreeMem(SecDescr);
Result:=nil;
FError:=GetLastError;
Exit;
End Else
Begin
Result:=pAce;
SizeNeeded:=1024;
SizeNeeded2:=1024;
GetMem(OwnerName,1024);
GetMem(DomainName,1024);
If ACE_HEADER(pAce^).AceType=ACCESS_ALLOWED_ACE_TYPE Then
Begin
FAccessMask:=ACCESS_ALLOWED_ACE(pAce^).Mask;
AccountSID:=@ACCESS_ALLOWED_ACE(pAce^).SidStart;
If Not LookupAccountSID(nil,AccountSID,OwnerName,SizeNeeded,DomainName,SizeNeeded2,OwnerType) Then
Begin
FreeMem(OwnerName);
FreeMem(DomainName);
FError:=GetLastError;
Exit;
End;
End;
If ACE_HEADER(pAce^).AceType=ACCESS_DENIED_ACE_TYPE Then
Begin
FAccessMask:=ACCESS_DENIED_ACE(pAce^).Mask;
AccountSID:=@ACCESS_DENIED_ACE(pAce^).SidStart;
If Not LookupAccountSID(nil,AccountSID,OwnerName,SizeNeeded,DomainName,SizeNeeded2,OwnerType) Then
Begin
FreeMem(OwnerName);
FreeMem(DomainName);
FError:=GetLastError;
Exit;
End;
End;
FOwnerName:=StrPas(OwnerName);
FDomain:=StrPas(DomainName);
FreeMem(OwnerName);
FreeMem(DomainName);
End;
End;
End;
FreeMem(SecDescr);
end;
procedure Register;
begin
RegisterComponents('NT Tools - Additional', [TNTFileSecurity]);
end;
end.