あるフォルダ・・・と言っても、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につながる情報がみつかりません。
どこから攻めたらいいのやら、情報をお持ちの方よろしくお願いします。
補足
今は、ファイルをコピーしてみて失敗したとき、GetLastError = 5
「アクセスは拒否されました。」で判断してごまかしています。
どうもアプローチ方法が違うみたいです。
私もこのスレッドをみて始めて調べてみたので詳しくありませんが、
フォントのインストール失敗はアクセス権とは余り関わりが無いみたいです。
そもそもフォントがインストールできないエラーは頻発するみたいです。
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;
補足
uses
AclAPI, AccCtrl;
ママん さん、レスありがとうございます。
とりあえず一点だけ
> フォントのインストール失敗はアクセス権とは余り関わりが無いみたいです。
これはですね、あるんです。
XPのUser権限には、フォントフォルダへの書き込み権限が、デフォルトで与えられていません。
一般には、Admin権限やPowerUser権限で運用しているユーザーが多いと思うのですが、
厳しく「user権限のみ!」という頑固なところもあるようで。
なお、外字使用中に外字フォント(EUDC.tteやEUDC.eufだったかな?)をファイルコピーで
上書きすることはできませんが、GDI32.DllのEnableEUDC API を使用し、
外字を(表現の正しさはともかく)無効化し、ファイル上書き、最後に
同APIで有効化することで、上書きできることはわかっています。
ということで、提示頂いたソースは、早速試してみます。
ぱっと見、自分の書き方がおかしかっただけのような気も・・・。
[報告]
XP SP1 admin 権限:○
XP SP2 user 権限:×
> if (countofexplicitentries > 0) then
> for i:= 0 to countofexplicitentries - 1 do
ここで、countofexplicitentries=0になってしまいます。
上記レスの関数 NTFSFileWritableには、'C:\Windows\Fonts' を与えています。
もしかしてuser権限では判定不可なんてことは?
まだまだ深い謎があるようです。
ツイート | ![]() |