6

フォルダーのファイル作成権限をプログラムで確認するにはどうすればよいですか? ファイルのパーミッションを変更しますか? ファイル権限を削除しますか?
GetNamedSecurityInfo書き込み可能なリターンが返されますC:\Program Filesが、UAC はAccess Denied (5)
アクセス許可を効果的に決定するにはどうすればよいですか?

私のコード:

function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE; 
  var Access: Cardinal): Cardinal;
var
  SecDesc: PSECURITY_DESCRIPTOR;
  pDacl: PACL;
  Trusteee: TRUSTEE_;
begin
  result := GetNamedSecurityInfo(PChar(FileName), ObjectType, 
    DACL_SECURITY_INFORMATION, nil, nil, @pDacl, nil, SecDesc);
  if ERROR_SUCCESS = result then
  begin
    // the pDacl may be NULL if the object has unrestricted access
    if pDacl <> nil then
    begin
      with Trusteee do
      begin
        pMultipleTrustee := nil;
        MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
        TrusteeForm := TRUSTEE_IS_NAME;
        TrusteeType := TRUSTEE_IS_UNKNOWN;
        ptstrName := 'CURRENT_USER';
      end;
      result := GetEffectiveRightsFromAcl(pDacl^, Trusteee, Access);
    end
    else
    begin
      Access := $FFFFFFFF;
      result := ERROR_SUCCESS;
    end;
    if SecDesc <> nil then
      LocalFree(Cardinal(SecDesc));
  end;
end;
4

1 に答える 1

9

私はこれに使用NT Utilitiesしています。Win2K/XP/Vista/7 でとてもうまくいきました

私のセットアッププロジェクトの例:

uses unitNTSecurity;

function CheckAccessToFile(DesiredAccess: DWORD; const FileOrDirName: string; ObjectName: string): Boolean;
var
  fo: TNTFileObject;
  acl: TAccessControlList;
  ace: TAccessControlElement;
  name: string;
  i: integer;
begin
  Result := False;
  if FileExists(FileOrDirName) or DirectoryExists(FileOrDirName) then
  begin
    fo := TNTFileObject.Create(FileOrDirName);
    acl := TAccessControlList.Create;
    try
      fo.GetDiscretionaryAccessList(acl);
      for i := 0 to acl.ElementCount - 1 do
      begin
        ace := acl.Element[i];
        name := ace.Name; // format is: BUILTIN\Users
        if (CompareText(ObjectName, name) = 0) and
          (ace.Type_ = aeAccessAllowed) and
          (DesiredAccess = ace.Mask) then
        begin
          Result := True;
          Break;
        end;
      end;
    finally
      fo.Free;
      acl.Free;
    end;
  end;
end;

modify許可を確認します。

Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');

私の答えに関するメモ:上記のコードはOPの質問に答えます:

変更権限をプログラムで確認する方法

ただし、アプリケーションがディレクトリに書き込めることを確認するだけでよい場合は、この種の ACL ソリューションを使用せず、実際に一時ファイルを書き込もうとします。 100%確実に書き込めます。

このコードは、一部のディレクトリにアクセス許可を付与する必要があるセットアップ プロセスの一部として使用するmodifyため、このコードは、そのディレクトリにこれらのアクセス許可がまだないかどうかを確認するために使用されます。

この問題については、いくつかの議論があります。

したがって、実際のシナリオに従ってソリューションを選択する必要があります。

于 2013-02-18T14:48:51.957 に答える