フォルダのアクセス権について


ん?  2006-06-02 23:20:20  No: 21986

あるフォルダ・・・と言っても、Fontsフォルダなんですが、
このフォルダのアクセス権を確認する必要がでてきました。

それで、VBのサンプルをみつけて、フォルダのアクセス権を確認してみようと思いました。

これです。
http://www1.harenet.ne.jp/cgi-bin/cgiwrap/unaap/chtml/chtml.cgi?key=sec_acl2

GetNamedSecurityInfoとGetExplicitEntriesFromAclを使って取得するものです。

いずれの関数も結果が0になり、正常終了しますが、GetExplicitEntriesFromAclの第二引数が0になります。
期待した結果にならないため、少なくともアクセス権に関する情報は取得できません。

ここで疑問・・・そもそも、このアプローチが間違っているような気がするのですが、
自ユーザーがフォルダに書き込み権限があるか調べるには、どのAPIが適当なんでしょう?

上記のサンプルは、ユーザーの列挙とそれぞれの権限を調査していますが、
今回の場合、他のユーザーの情報は不要で、自分が書き込み可能なユーザーで
あるか確認できれば十分です。

ちなみに、LookupAccountNameを使えばSIDなるものを取得できますが、
ここからアクセス権を得るAPIにつながる情報がみつかりません。

どこから攻めたらいいのやら、情報をお持ちの方よろしくお願いします。


ん?  2006-06-02 23:23:47  No: 21987

補足

今は、ファイルをコピーしてみて失敗したとき、GetLastError = 5
「アクセスは拒否されました。」で判断してごまかしています。


ママん  2006-06-05 01:55:03  No: 21988

どうもアプローチ方法が違うみたいです。
私もこのスレッドをみて始めて調べてみたので詳しくありませんが、
フォントのインストール失敗はアクセス権とは余り関わりが無いみたいです。
そもそもフォントがインストールできないエラーは頻発するみたいです。
googleで調べるとFAQで結構出てきます。
「〜ファイルは現在使用中であるため…」と出てインストールできない
h ttp://www.petitboys.com/design/mt/archives/000173.html
ユーザー名が日本語の場合にインストールエラー
h ttp://www.screen.co.jp/ga_product/sento/support/ttf_avoid_inst_error.html

NTFSファイルのアクセス件についても調べましたが、こちらも見た感じ無茶苦茶っぽいですね…もう何が何だかって感じです。

一応、NTFSで書き込み可能かどうか調べる関数については調べ一応動作しますが、意味不明です。

function NTFSFileWritable(filename: string):boolean;
//h ttp://www.bpsoftware.com/blog/2005_11_01_archive.html
  function IsNTFS(AFileName: string): Boolean;
  var
    NotUsed: DWORD;
    VolumeFlags: DWORD;
    VolumeInfo: array[0..MAX_PATH] of Char;
    VolumeSerialNumber: DWORD;
    PartitionType: array[0..32] of Char;
  begin
    GetVolumeInformation(PChar(ExtractFileDrive(AFileName)+'\'),
      nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed,
      VolumeFlags, PartitionType, 32);
    Result := (PartitionType = 'NTFS');
  end;
type
  TEAArray = Array [0..0] of EXPLICIT_ACCESS;
  PEAArray = ^TEAArray;
var
  pSD: PSECURITY_DESCRIPTOR;
  countofexplicitentries: Cardinal;
  ListOfExplicitEntries: PEXPLICIT_ACCESS_A;
  EAList: PEAArray;
  pExplicitAccess: EXPLICIT_ACCESS;
  pDACL: PACL;
  i: integer;
begin
  Result:=False;
  if IsNTFS(filename)=False then
  begin
    Result:=True;
    exit;
  end;

  if not (GetNamedSecurityInfo(PChar(filename),SE_FILE_OBJECT,
    DACL_SECURITY_INFORMATION, Nil, Nil, @pDACL, Nil,pSD)=0) then
  begin
    Exit;
  end;

  GetMem(ListOfExplicitEntries,SizeOf(ListOfExplicitEntries));

  if GetExplicitEntriesFromAcl(pDACL^,countofexplicitentries,@EAList) <>
    ERROR_SUCCESS then
  begin
    FreeMem(ListOfExplicitEntries);
    Exit;
  end;

  if (countofexplicitentries > 0) then
  for i:= 0 to countofexplicitentries - 1 do
  begin
    pExplicitAccess:= EAList[i];

    if pExplicitAccess.grfAccessMode = DENY_ACCESS then
    begin
      FreeMem(ListOfExplicitEntries);
      Exit;
    end;
  end;

  Result:=True;
end;


ママん  2006-06-05 01:58:03  No: 21989

補足
uses
  AclAPI, AccCtrl;


ん?  2006-06-05 17:34:21  No: 21990

ママん さん、レスありがとうございます。

とりあえず一点だけ
> フォントのインストール失敗はアクセス権とは余り関わりが無いみたいです。

これはですね、あるんです。
XPのUser権限には、フォントフォルダへの書き込み権限が、デフォルトで与えられていません。
一般には、Admin権限やPowerUser権限で運用しているユーザーが多いと思うのですが、
厳しく「user権限のみ!」という頑固なところもあるようで。

なお、外字使用中に外字フォント(EUDC.tteやEUDC.eufだったかな?)をファイルコピーで
上書きすることはできませんが、GDI32.DllのEnableEUDC API を使用し、
外字を(表現の正しさはともかく)無効化し、ファイル上書き、最後に
同APIで有効化することで、上書きできることはわかっています。

ということで、提示頂いたソースは、早速試してみます。
ぱっと見、自分の書き方がおかしかっただけのような気も・・・。


ん?  2006-06-05 20:13:51  No: 21991

[報告]
XP SP1 admin 権限:○

XP SP2 user 権限:×
>   if (countofexplicitentries > 0) then
>   for i:= 0 to countofexplicitentries - 1 do
ここで、countofexplicitentries=0になってしまいます。

上記レスの関数 NTFSFileWritableには、'C:\Windows\Fonts' を与えています。
もしかしてuser権限では判定不可なんてことは?
まだまだ深い謎があるようです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加