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 >
Pascal/Delphi Source File  |  2002-01-21  |  6KB  |  187 lines

  1. unit NTFileSecurity;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NTSecurityDecls;
  7.  
  8. type
  9.   TNTFileSecurity = class(TComponent)
  10.   private
  11.     { Private declarations }
  12.     FFileName:String;
  13.     FOwnerName:String;
  14.     FDomain:String;
  15.     FAccessMask:DWORD;
  16.     FError:DWORD;
  17.   protected
  18.     { Protected declarations }
  19.   public
  20.     { Public declarations }
  21.   published
  22.     { Published declarations }
  23.     property FileName:String read FFileName write FFileName;
  24.     property OwnerName:String read FOwnerName write FOwnerName;
  25.     property DomainName:String read FDomain write FDomain;
  26.     property AccessMask:DWORD read FAccessMask write FAccessMask;
  27.     property ErrorCode:DWORD read FError;
  28.     function GetAceCount:Integer;
  29.     function GetFileAce(Index:Integer):Pointer;
  30.   end;
  31.  
  32. procedure Register;
  33.  
  34. implementation
  35.  
  36. function TNTFileSecurity.GetAceCount:Integer;
  37. var SecDescr:PSecurityDescriptor;
  38.     SizeNeeded:DWORD;
  39.     DaclPresent:BOOL;
  40.     DaclDefaulted:BOOL;
  41.     FilePacl:PACL;
  42.     AclInfo:ACL_SIZE_INFORMATION;
  43.     PaclInfo:Pointer;
  44.     dwAclInformationClass:TAclInformationClass;
  45. begin
  46.      OwnerName:='';
  47.      DomainName:='';
  48.      FError:=0;
  49.      Result:=0;
  50.      If FFileName='' Then
  51.      Begin
  52.           Result:=-1;
  53.           Exit;
  54.      End;
  55.      GetMem(SecDescr,1024);
  56.      If Not GetFileSecurity(PChar(FFilename),DACL_SECURITY_INFORMATION,SecDescr,1024,SizeNeeded) Then
  57.      Begin
  58.           FreeMem(SecDescr);
  59.           Result:=-1;
  60.           FError:=GetLastError;
  61.           Exit;
  62.      End;
  63.      If Not GetSecurityDescriptorDacl(SecDescr,DaclPresent,FilePacl,DaclDefaulted) Then
  64.      Begin
  65.           FreeMem(SecDescr);
  66.           Result:=-1;
  67.           FError:=GetLastError;
  68.           Exit;
  69.      End;
  70.      PaclInfo:=@AclInfo;
  71.      dwAclInformationClass:=AclSizeInformation;
  72.      If Not GetAclInformation(FilePacl^,PaclInfo,SizeOf(ACL_SIZE_INFORMATION),dwAclInformationClass) Then
  73.      Begin
  74.           FreeMem(SecDescr);
  75.           Result:=-1;
  76.           FError:=GetLastError;
  77.           Exit;
  78.      End;
  79.      If DaclPresent Then Result:=AclInfo.AceCount;
  80.      FreeMem(SecDescr);
  81. end;
  82.  
  83. function TNTFileSecurity.GetFileAce(Index:Integer):Pointer;
  84. var SecDescr:PSecurityDescriptor;
  85.     SizeNeeded:DWORD;
  86.     SizeNeeded2:DWORD;
  87.     DaclPresent:BOOL;
  88.     DaclDefaulted:BOOL;
  89.     FilePacl:PACL;
  90.     AclInfo:ACL_SIZE_INFORMATION;
  91.     PaclInfo:Pointer;
  92.     dwAclInformationClass:TAclInformationClass;
  93.     pAce:Pointer;
  94.     OwnerName:PChar;
  95.     DomainName:PChar;
  96.     OwnerType:SID_NAME_USE;
  97.     AccountSID:PSID;
  98. begin
  99.      FError:=0;
  100.      Result:=nil;
  101.      If FFileName='' Then
  102.      Begin
  103.           Result:=nil;
  104.           Exit;
  105.      End;
  106.      GetMem(SecDescr,1024);
  107.      If Not GetFileSecurity(PChar(FFilename),DACL_SECURITY_INFORMATION,SecDescr,1024,SizeNeeded) Then
  108.      Begin
  109.           FreeMem(SecDescr);
  110.           Result:=nil;
  111.           FError:=GetLastError;
  112.           Exit;
  113.      End;
  114.      If Not GetSecurityDescriptorDacl(SecDescr,DaclPresent,FilePacl,DaclDefaulted) Then
  115.      Begin
  116.           FreeMem(SecDescr);
  117.           Result:=nil;
  118.           FError:=GetLastError;
  119.           Exit;
  120.      End;
  121.      PaclInfo:=@AclInfo;
  122.      dwAclInformationClass:=AclSizeInformation;
  123.      If Not GetAclInformation(FilePacl^,PaclInfo,SizeOf(ACL_SIZE_INFORMATION),dwAclInformationClass) Then
  124.      Begin
  125.           FreeMem(SecDescr);
  126.           Result:=nil;
  127.           FError:=GetLastError;
  128.           Exit;
  129.      End;
  130.      If DaclPresent Then
  131.      Begin
  132.           If AclInfo.AceCount>0 Then
  133.           Begin
  134.                If Not GetAce(FilePacl^,Index,pAce) Then
  135.                Begin
  136.                     FreeMem(SecDescr);
  137.                     Result:=nil;
  138.                     FError:=GetLastError;
  139.                     Exit;
  140.                End Else
  141.                Begin
  142.                     Result:=pAce;
  143.                     SizeNeeded:=1024;
  144.                     SizeNeeded2:=1024;
  145.                     GetMem(OwnerName,1024);
  146.                     GetMem(DomainName,1024);
  147.                     If ACE_HEADER(pAce^).AceType=ACCESS_ALLOWED_ACE_TYPE Then
  148.                     Begin
  149.                          FAccessMask:=ACCESS_ALLOWED_ACE(pAce^).Mask;
  150.                          AccountSID:=@ACCESS_ALLOWED_ACE(pAce^).SidStart;
  151.                          If Not LookupAccountSID(nil,AccountSID,OwnerName,SizeNeeded,DomainName,SizeNeeded2,OwnerType) Then
  152.                          Begin
  153.                               FreeMem(OwnerName);
  154.                               FreeMem(DomainName);
  155.                               FError:=GetLastError;
  156.                               Exit;
  157.                          End;
  158.                     End;
  159.                     If ACE_HEADER(pAce^).AceType=ACCESS_DENIED_ACE_TYPE Then
  160.                     Begin
  161.                          FAccessMask:=ACCESS_DENIED_ACE(pAce^).Mask;
  162.                          AccountSID:=@ACCESS_DENIED_ACE(pAce^).SidStart;
  163.                          If Not LookupAccountSID(nil,AccountSID,OwnerName,SizeNeeded,DomainName,SizeNeeded2,OwnerType) Then
  164.                          Begin
  165.                               FreeMem(OwnerName);
  166.                               FreeMem(DomainName);
  167.                               FError:=GetLastError;
  168.                               Exit;
  169.                          End;
  170.                     End;
  171.                     FOwnerName:=StrPas(OwnerName);
  172.                     FDomain:=StrPas(DomainName);
  173.                     FreeMem(OwnerName);
  174.                     FreeMem(DomainName);
  175.                End;
  176.           End;
  177.      End;
  178.      FreeMem(SecDescr);
  179. end;
  180.  
  181. procedure Register;
  182. begin
  183.      RegisterComponents('NT Tools - Additional', [TNTFileSecurity]);
  184. end;
  185.  
  186. end.
  187.