|
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
|