0

ちょうど今、ソフトウェアパッケージのインストール中に起動される小さなアプリケーションでローカリゼーションのバグを修正することを検討しています。小さなアプリケーションは、基本的に、アプリケーションデータ内の独自のフォルダに対するパーミッションを総当たり攻撃して、全員をフルアクセスに設定します。

問題は、全員がローカライズされていない場合に発生します。私はSIDを使用する必要があることを知っています。これは誰にとってもですS-1-1-0。SIDを使用してアクセス許可を設定するためのWinAPI関数が見つかりません。

この関数は現在使用してBuildExplicitAccessWithNameおりSetNamedSecurityInfo、以下に示すように

function setfullaccess(foldername:string):boolean;    //B2415 MDE
var
 pDACL: PACL;
 pEA: PEXPLICIT_ACCESS_A;
 R: DWORD;
begin
 result := true;
 pEA := AllocMem(SizeOf(EXPLICIT_ACCESS));
 BuildExplicitAccessWithName(pEA, 'EVERYONE', GENERIC_ALL{GENERIC_READ},GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT{NO_INHERITANCE});
 R := SetEntriesInAcl(1, pEA, nil, pDACL);
 if R = ERROR_SUCCESS then
 begin
  if SetNamedSecurityInfo(pchar(foldername), SE_FILE_OBJECT,DACL_SECURITY_INFORMATION, nil, nil, pDACL, nil) <> ERROR_SUCCESS then result := false;
  LocalFree(Cardinal(pDACL));
 end
 else result := false;//ShowMessage('SetEntriesInAcl failed: ' + SysErrorMessage(R));
end;

代わりにどの関数を使用することを検討する必要がありますか?

4

2 に答える 2

1

WinAPIドキュメントを検索した後、以下の解決策を探しました。基本的に、私はSIDを使用して「読み取り可能な」名前を検索し、それを使用します。それは最もエレガントな解決策ではありませんが、私にとってはうまくいきます。

procedure TTestform.Button4Click(Sender: TObject);
var
 Sid: PSID;
 peUse: DWORD;
 cchDomain: DWORD;
 cchName: DWORD;
 Name: array of Char;
 Domain: array of Char;
 pDACL: PACL;
 pEA: PEXPLICIT_ACCESS_A;
 R: DWORD;
 foldername: String; //Temp to hardcode
begin
 foldername := 'C:\TEMP'; //Temp to hardcode
 Sid := nil;
 Win32Check(ConvertStringSidToSidA(PChar('S-1-1-0'), Sid));
 cchName := 0;
 cchDomain := 0;
 //Get Length
 if (not LookupAccountSid(nil, Sid, nil, cchName, nil, cchDomain, peUse)) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
 begin
  SetLength(Name, cchName);
  SetLength(Domain, cchDomain);
  if LookupAccountSid(nil, Sid, @Name[0], cchName, @Domain[0], cchDomain, peUse) then
  begin
   pEA := AllocMem(SizeOf(EXPLICIT_ACCESS));
   BuildExplicitAccessWithName(pEA, PChar(Name), GENERIC_ALL{GENERIC_READ},GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT{NO_INHERITANCE});
   R := SetEntriesInAcl(1, pEA, nil, pDACL);
   if R = ERROR_SUCCESS then
   begin
    if SetNamedSecurityInfo(pchar(foldername), SE_FILE_OBJECT,DACL_SECURITY_INFORMATION, nil, nil, pDACL, nil) <> ERROR_SUCCESS then ShowMessage('SetNamedSecurityInfo failed: ' + SysErrorMessage(GetLastError));
    LocalFree(Cardinal(pDACL));
   end
   else ShowMessage('SetEntriesInAcl failed: ' + SysErrorMessage(R));
  end;
 end;
end;
于 2012-06-29T13:32:51.807 に答える
0

lookupとの両方の使用を回避するための代替アプローチbuild

var SID: JwaWinNT.PSid; // JWA clashes with Delphi XE2 Windows.Windows.PSID type
    pDACL: PACL;
    EA: EXPLICIT_ACCESS;
    SID_DATA: array[1..SECURITY_MAX_SID_SIZE] of byte;
    SID_DATA_SIZE: DWORD;

   SID_DATA_SIZE := Length(SID_DATA);
   Pointer(SID) := @SID_DATA; // @SID_DATA[Low(SID_DATA)]  for non-static arrays 

    pDACL := nil;
//   if ConvertStringSidToSid(Auth_Users_SID, SID) then
   if CreateWellKnownSid(WinAuthenticatedUserSid, nil, SID, SID_DATA_SIZE) then
   try
      EA.grfInheritance := SUB_CONTAINERS_AND_OBJECTS_INHERIT; // NO_INHERITANCE; // 0
      EA.grfAccessMode :=  GRANT_ACCESS;
      EA.grfAccessPermissions := GENERIC_ALL;

      EA.Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
      EA.Trustee.pMultipleTrustee := nil;
      EA.Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
      EA.Trustee.TrusteeForm := TRUSTEE_IS_SID;
      EA.Trustee.ptstrName   := pointer(SID); 

      if ERROR_SUCCESS = SetEntriesInAcl(1, @EA, nil, pDACL) then begin

       // optional creation of PATH and 0-bytes dummy file skipped 

        SetNamedSecurityInfo(pchar(foldername), SE_FILE_OBJECT, ....  {see the author's answer above }
      end;

   finally
     LocalFree(pDACL); // SID is not allocated on heap - no need to free it
   end;

このスニペットは、 http://forum.vingrad.ru/forum/topic-374131/0.html#st_15_view_0のページ#2でユニットと照合することもできます。

于 2016-03-21T15:46:15.627 に答える