my $GetFileSecurity = new Win32::API('Advapi32', 'GetFileSecurity', ['P', 'N', 'P', 'N', 'P'], 'N' ); sub GetFileSecurity { my $file = shift; my $bufSize = 1000; my $bufSD = pack("x$bufSize"); my $pbufNeeded = pack('x4'); my $strSD = ''; foreach my $infoRequest (1,2,4,8) { my $sd; if ($GetFileSecurity->Call($file, $infoRequest, $bufSD, $bufSize, $pbufNeeded) ) { my $size = unpack('L', $pbufNeeded); my $binSD = substr($bufSD,0, $size); $strSD .= SD2Str($binSD); } } return $strSD; } my $ConvertSDToString = new Win32::API('Advapi32', 'ConvertSecurityDescriptorToStringSecurityDescriptor', ['P', 'N', 'N', 'P', 'P'], 'N' ); sub SD2Str { my $SD = shift; return undef if (!IsValidSD($SD)); my $rev = 1; my $info = 7; my $p1 = ' '; my $len = ' '; return '' if ( !$ConvertSDToString->Call($SD, $rev, $info, $p1, $len) ); my $str = unpack('p', $p1); return $str; }