2017-03-07 21 views
3

Delphi 2009でファイルの所有者を取得するにはどうすればよいですか?Delphi 2009 - ファイルの所有者名を取得

properties

私は、ファイルを取得する機能は、次のように属性を得た:...

type 
    TCustomFileInfo= record 
    CompanyName, 
    Owner, 
    SpecialBuild: string; 
    procedure Clear; 
    end; 

function GetFileInfo(const FileName: string): TCustomFileInfo; 
type 
    PLandCodepage = ^TLandCodepage; 
    TLandCodepage = record 
    wLanguage, 
    wCodePage: word; 
    end; 
var 
    dummy, 
    len: cardinal; 
    buf, pntr: pointer; 
    lang: string; 
begin 
    len := GetFileVersionInfoSize(PChar(FileName), dummy); 
    if len = 0 then 
    RaiseLastOSError; 
    GetMem(buf, len); 
    try 
    if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then 
     RaiseLastOSError; 

    if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then 
     RaiseLastOSError; 

    lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]); 

    // Get Company's name, if available... 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\CompanyName'), pntr, len){ and (@len <> nil)} then 
     result.CompanyName := PChar(pntr); 
    finally 
    FreeMem(buf); 
    end; 
end; 

この仕入属性の罰金働くが、私は所有者を取得する方法はないん。また

、私は、ファイルはバージョン番号ではありませんから、は理にかなっているファイルのバージョン番号GetFileVersionInfoSizeは動作しませんが、持っていないファイルに対して、この同じメソッドを使用しようとすると、すべて。

GetFileVersionInfoSizeの代替方法、またはファイルの所有者を取得する別の方法はありますか?私はWindows APIにあまり慣れていないので、これが私が望むもの(所有者の名前を得る)を達成する正しい方法であるかどうかは本当に分かりません。

+0

これは、必要なファイルシステムプロパティですか? –

+0

'GetLastError()'が実際にエラーが発生しない限り、 'GetFileVersionInfoSize()'は0を返してもエラーではありません。 'GetLastError()'が0を返す場合でも、 'RaiseLastOSError()'は常に 'EOSError'例外を送出します。 –

+0

@DavidHeffernan残念ながらポルトガル語で写真を撮りましたが、あなたが理解できると思います:[https:///puu.sh/uywsh/5f59bf2dc9.png) – Alisson

答えて

7

ファイルの所有権に関する情報は、バージョンリソースに格納されていないため、VerQueryValue()を使用してアクセスすることはできません。

所有権はファイルのセキュリティに関連しているため、ファイル名がある場合はGetFileSecurity()またはGetNamedSecurityInfo()、ファイルを開いている場合はGetUserObjectSecurity()を使用する必要があります。

どちらの方法でも、取得する情報のタイプを指定する入力として、SECURITY_INFORMATIONの値を入力します。この場合、OWNER_SECURITY_INFORMATIONを使用してファイルの所有者のSIDを要求します。成功した場合は、LookupAccountSid()またはWMIを使用して所有者の名前を取得できます。

+0

あなたの答えの後、私は 'GetFileSecurity()'の使用例を探し、[このサンプル](http://www.delphipages.com/forum/showthread)を見つけました。 php?p = 194849)。私はユーザーとドメイン、私を助けてくれてありがとう! – Alisson

2

これは、Remyの回答を補完するもので、Win32_LogicalFileOwnerWin32_LogicalFileSecuritySetting WMIクラスを使用して、ファイル所有者を取得するためのサンプルコードです。

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 


function GetFileOwner(const AFileName : string) : string; 
var 
    LSWbemLocator, LWMIService, LObjects, LObject : OLEVariant; 
    FileName  : string; 
    LEnumerator : IEnumvariant; 
    iValue   : LongWord; 
begin; 
    Result := ''; 
    LSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    LWMIService := LSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); 

    //Escape the `\` chars in the FileName value because the '\' is a reserved character in WMI. 
    FileName  := StringReplace(AFileName, '\', '\\', [rfReplaceAll]); 
    LObjects := LWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_LogicalFileSecuritySetting="%s"} WHERE AssocClass = Win32_LogicalFileOwner ResultRole = Owner', [FileName])); 

    LEnumerator := IUnknown(LObjects._NewEnum) as IEnumVariant; 
    if LEnumerator.Next(1, LObject, iValue) = 0 then 
    Result := string(LObject.AccountName); // 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
    Writeln(GetFileOwner('C:\Foo.Bar')); 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
    end; 
    Readln; 
end. 
関連する問題