2013-02-18 25 views
6

フォルダのファイル権限を作成する方法をプログラムで確認するにはどうすればよいですか? ファイルのアクセス権を変更しますか?ファイル許可を削除しますか?
GetNamedSecurityInfoC:\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; 
+7

*許可を得るよりも許してもらうのが簡単です* –

+1

'Program Files'では許してもらう必要はありません。仮想ストア内のWindows書き込みファイル。 – barbaris

+1

何のため?あなたがその情報を表示したいGUIを持っているなら、権限があるかどうかを知る必要があります。選択肢はありません。あなたが実際に*何かを書く必要があるなら、何も打ち負かすことはありません:一時ファイルを作成し、それを削除してください。私は、サーバソフトウェアがSambaのときに、マップされたネットワークドライブに書き込みアクセス権があるかどうか、誰が確実に言うことができるのか、ヒントが本当に信頼できるものか疑問に思う。設定ファイルへの完全アクセスがあっても、それは難しいかもしれません! –

答えて

9

私は、このためにNT Utilitiesを使用してきました。

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

:私のセットアッププロジェクトからのWin2K/XP/Vistaの/ 7

例を私のために非常によく働い:modify許可を

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; 

チェック私の答えについてのメモ:上記のコードは、 OPの質問:

どのように私はプログラム的なアクセス許可

を変更しかし、あなたがする必要があるすべては、あなたのアプリケーションがディレクトリに書き込みできることですチェックであれば、私はうチェックしますかではなく、この種のACLソリューションに行き、実際に一時ファイルを書き込もうとするので、私は100%確実に書き込むことができます。

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

は、この問題について、いくつかの議論があります:How can I use Delphi to test if a Directory is writeable?

Get FileSystem Restrictions

    • だから、あなたの実際のシナリオに応じて、あなたのソリューションを選択する必要があります。

  • 関連する問題