お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ファイルの所有者を取得します(NT専用)"



こんにちは、仁義偉王です。NTで所有者の情報を取得します。



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ メモリの管理とか、例外対策、エラー処理はほとんど省かれています。
  実際にアプリケーションに組み込む場合は、ちゃんとコーディングし
  てください。}
procedure GetOwnerName(FileName, lpszSystem: string;
                       var User, Domain: string);
var
  pSecurityDescriptor: pointer;  // 受け取るセキュリティ記述子(=SD)
  nLength,                       // pSecurityDescriptorのサイズ
  lpnLengthNeeded: DWORD;        // 必要なバッファサイズを受け取る
  Name,                          // 受け取るユーザ名
  ReferencedDomainName: PChar;   // 受け取るドメイン名
  cbName,                        // NAMEのサイズ
  cbReferencedDomainName: DWORD; // ReferencedDomainNameのサイズ
  peUse: SID_NAME_USE;
  pOwner: PSID;
  lpbOwnerDefaulted: BOOL;
  fRet: Boolean;
begin
  nLength := 1024;                      // これらのサイズは不足する
  cbName := 256;                        // 可能性があります。関数の
  cbReferencedDomainName := 256;        // 戻り値から再定義する必要
                                        // もあります。
  GetMem(pSecurityDescriptor, nLength);
  GetMem(Name, cbName);
  GetMem(ReferencedDomainName, cbReferencedDomainName);

  {まず、セキュリティ記述子(=SD)を取得します}
  fRet := GetFileSecurity(PChar(FileName),    // ファイル名を指定
                  OWNER_SECURITY_INFORMATION, // 必要なのはオーナーの情報
                  pSecurityDescriptor,        // SDがセットされるバッファ
                  nLength,                    // ↑ のバッファサイズ
                  lpnLengthNeeded);           // nLengthが足りない時に
                                              // セットされます。
  if fRet then
  begin
    {次にSDからオーナーのSIDを取得します}
    if GetSecurityDescriptorOwner(
                  pSecurityDescriptor,        // 取得済みのSD
                  pOwner,                     // SID用のバッファ
                  lpbOwnerDefaulted)          //  ↑ のサイズ
    then
    begin
      if pOwner = nil then
      begin
        User := '';
        Domain := '';
      end
      else
      begin
        {SIDからユーザ情報を取得します}
        if LookupAccountSid(
                       PChar(lpszSystem), // 普通は nil でよいはずです
                       pOwner,                 // オーナーのSID
                       Name,                   // 受け取るオーナー名
                       cbName,                 //  ↑ のサイズ
                       ReferencedDomainName,   // 受け取るドメイン名
                       cbReferencedDomainName, //  ↑ のサイズ
                       peUse)
        then
        begin
          User := Name;
          Domain := ReferencedDomainName;
        end;
      end;
    end;
  end;

  FreeMem(pSecurityDescriptor);
  FreeMem(Name);
  FreeMem(ReferencedDomainName);
end;

{procedure 呼び出しの例です}
procedure TForm1.Button1Click(Sender: TObject);
var
  User,
  Domain: string;
begin
  GetOwnerName('n:\test.dat', '', User, Domain);
  //                         ↑ 必要であればリモートコンピュータ名を
  //                            指定します
  ShowMessage(Domain + '\' + User);
end;

end.


                              98/7/16(Thu) 09:01pm  CXJ04762 仁義偉王

Original document by 仁義偉王        氏 ID:(CXJ04762)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum