Hi, Taurus,
The easiest way to get an access list is using WMI like this:
Code: Select all
; only for folders, for files use CIM_DataFile instead of CIM_Directory
filePath := A_ProgramFiles ; specify a folder path
AccessMask := ComObjGet("winmgmts:").Get("CIM_Directory.name='" . filePath . "'").AccessMask
if (AccessMask = "") {
MsgBox, Failed to get AccessMask
Return
}
FILE_ADD_FILE := 2, FILE_DELETE_CHILD := 64
MsgBox, % "ADD_FILE = " . !!(AccessMask & FILE_ADD_FILE) . "`n"
. "DELETE_CHILD = " . !!(AccessMask & FILE_DELETE_CHILD)
Results may vary, if you run the script as admin.
The code to get the full access list for files or folders:
Code: Select all
if !AccessMask := GetAccessMask(A_ProgramFiles)
Return
MsgBox, % AccessMask.FILE_ADD_FILE
for k, v in AccessMask
MsgBox, % k . " = " . v
GetAccessMask(filePath) {
IsDirectory := InStr( FileExist(filePath), "D" )
AccessMask := { 1: IsDirectory ? "FILE_LIST_DIRECTORY" : "FILE_READ_DATA"
, 2: IsDirectory ? "FILE_ADD_FILE" : "FILE_WRITE_DATA"
, 4: IsDirectory ? "FILE_ADD_SUBDIRECTORY" : "FILE_APPEND_DATA"
, 8: "FILE_READ_EA"
, 16: "FILE_WRITE_EA"
, 32: IsDirectory ? "FILE_TRAVERSE" : "FILE_EXECUTE"
, 64: IsDirectory ? "FILE_DELETE_CHILD" : ""
, 128: "FILE_READ_ATTRIBUTES"
, 256: "FILE_WRITE_ATTRIBUTES"
, 65536: "DELETE"
, 131072: "READ_CONTROL"
, 262144: "WRITE_DAC"
, 524288: "WRITE_OWNER"
, 1048576: "SYNCHRONIZE" }
fileAccessMask := ComObjGet("winmgmts:").Get( (IsDirectory ? "CIM_Directory" : "CIM_DataFile") . ".name='" . filePath . "'" ).AccessMask
if (fileAccessMask = "") {
MsgBox, Failed to get AccessMask
Return
}
accsessList := {}
for k, v in AccessMask
( v && accsessList[v] := !!(fileAccessMask & k) )
Return accsessList
}
CIM_DataFile
CIM_Directory
File and Directory Access Rights Constants