HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1014
とあるプログラマフォルダ・ファイルへの操作権限6解決


とあるプログラマ

リンク

2018/10/14(Sun) 22:26:41|NO.85581

ファイルの書き込み・移動・リネームを行うときに対象のフォルダ・ファイルがAdmin権限じゃないと操作できないときにそれを検知する方法ってありますかね?
試しに空ファイルでも書き込んでみるのが手っ取り早いんですが、notesaveとbsaveは書き込めないときにエラーが出て終わってしまうので、なんか別の関数等で書き込むことが出来るか調べる方法ありますでしょうか。
pipeexecで[echo >>パス]で終了メッセージ受け取れば一応は確認できるのですが、余計な手間かけすぎかなぁ、という感じで保留です。(最終手段)



この記事に返信する


あらや

リンク

2018/10/14(Sun) 23:21:08|NO.85584

未確認ですがAPIのGetNamedSecurityInfo関数を使うと出来るかもしれません。



吹雪

リンク

2018/10/15(Mon) 03:05:26|NO.85585

CreateFileで確認できた気がするようなしないような…



とあるプログラマ

リンク

2018/10/15(Mon) 22:34:17|NO.85591

返信遅れて申し訳ないです。

>>あらやさん
GetNamedSecurityInfoを使用したところDACLという整数値(ポインタ?)が返ってきたのですが、ACLは疎いためこの数値の扱い方が分からないです…
もし可能であればどう使うか、またはアクセス権限の確認サンプルを頂けるでしょうか?

>>吹雪さん
CreateFileを使うとProgram FilesなどのフォルダにアクセスしたときにVirtualStoreに飛ばされてしまい、拒否されたことが分からないです…
existでC:\Users\(ユーザー名)\AppData\Local\VirtualStore\ファイル名 を取得して0以上が返れば失敗していることを確認することは一応できますが、効率というか必ずこの方法で確認取れるかが分からないので、可能であれば別の確実な方法で確認したいです…
VirtualStoreのパスが全てのVista以降のWindowsで(ユーザー名以外が)絶対同じかどうかも分からないです。(VirtualStoreパスは特殊ディレクトリ取得で取得できない?)
VirtualStoreマジで厄介だ…



MillkeyStars

リンク

2018/10/16(Tue) 14:45:09|NO.85593

ファイルが存在する場合、CreateFile で開いてそのファイルのハンドルを GetFinalPathNameByHandle に渡す。
そうすると、もしファイルが VirtualStore にリダイレクトされている場合は、VirtualStore のファイルパスが取得できる。
リダイレクトされていない場合は、普通にパスが取得できるからそれで判断する事ができる。

void FileAccessUAC(){ MessageBox(NULL, "LPLP", "EELE", MB_OK); char FileName[] = "C:\\Windows\\TestFile.Txt"; //プロセスをわざと標準ユーザーにして HANDLE OpenHandle = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (OpenHandle == INVALID_HANDLE_VALUE){ MessageBox(NULL, "ファイルのハンドルを作成できませんでした", "", MB_OK); return; } char FinalName[512] = {}; char LPLP[512] = {}; DWORD dwRet = GetFinalPathNameByHandle(OpenHandle, FinalName, 512, FILE_NAME_OPENED); char LPLP[512] = {}; sprintf_s(LPLP, "%s :: %d", FinalName,dwRet); MessageBox(NULL, LPLP, "", MB_OK); CloseHandle(OpenHandle); }
検証に使用したC++ソースコード



MillkeyStars

リンク

2018/10/16(Tue) 14:46:48|NO.85594

NO.85593 検証スクリプトでは、ファイルがなくても強制的に作成されるようにしてあります。



とあるプログラマ

リンク

2018/10/17(Wed) 02:34:40|NO.85597

>>MillkeyStarsさん
こんな関数があったんですね。無事VirtualStoreのパスが返ってきました。
ありがとうございます。これを使って確かめようと思います。

以下検証したHSPスクリプトです。


//Microsoft Windows Dev CenterのURL //https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfinalpathnamebyhandlea //kernel32.asにはGetFinalPathNameByHandleの定義はない。 #uselib "kernel32" #cfunc CreateFile "CreateFileA" sptr,int,int,int,int,int,int #cfunc GetFinalPathNameByHandle "GetFinalPathNameByHandleA" sptr,int,int,int #define GENERIC_WRITE $40000000 #define FILE_SHARE_READ $00000001 #define FILE_SHARE_WRITE $00000002 #define OPEN_ALWAYS $00000004 #define FILE_ATTRIBUTE_NORMAL $00000080 #define FILE_NAME_OPENED $00000008 sdim FileName,256 FileName="C:\\Program Files\\test.txt" handle=CreateFile(varptr(FileName) , GENERIC_WRITE , FILE_SHARE_READ|FILE_SHARE_WRITE , 0 , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0) if handle=-1 { dialog "ファイルのハンドルを作成できませんでした",0 end } mes "handle="+handle sdim FinalName,256 ;ここの確保サイズが返ってくるパスより小さいとパスの代入がされない。 dwRet=GetFinalPathNameByHandle(handle , varptr(FinalName) , varsize(FinalName) , FILE_NAME_OPENED) mes "stat="+stat mes "dwRet="+dwRet mes "FinalName="+FinalName if instr(FinalName,0,"AppData\\Local\\VirtualStore\\")!-1 { mes "VirtualStoreに飛ばされた" } stop



ONION software Copyright 1997-2021(c) All rights reserved.