using system;
using system.management;
using system.collections;
class tester
{
public static void main()
{
try
{
managementpath path = new managementpath( );
path.server = ".";
path.namespacepath = @"root/cimv2";
path.relativepath = @"win32_logicalfilesecuritysetting.path='c://test'"; // using tmp as folder name
managementobject lfs = new managementobject(path);
// dump all trustees (this includes owner)
foreach (managementbaseobject b in lfs.getrelated())
console.writeline("trustee: {0} /t sid [{1}]", b["accountname"], b["sid"]);
// get the security descriptor for this object
managementbaseobject outparams = lfs.invokemethod("getsecuritydescriptor", null, null);
if (((uint)(outparams.properties["returnvalue"].value)) == 0)
{
managementbaseobject descriptor = ((managementbaseobject)(outparams.properties["descriptor"].value));
managementbaseobject[] daclobject = ((managementbaseobject[])(descriptor.properties["dacl"].value));
dumpaces(daclobject);
managementbaseobject ownerobject = ((managementbaseobject)(descriptor.properties["owner"].value));
dumpownerproperties(ownerobject.properties); // show owner properies
}
}
catch(exception e)
{
console.writeline(e);
console.readline();
}
}
static void dumpaces(managementbaseobject[] daclobject)
{
// ace masks see: winnt.h
string[] filedesc = {"file_read_data", "file_write_data", "file_append_data", "file_read_ea",
"file_write_ea", "file_execute", "file_delete_child", "file_read_attributes",
"file_write_attributes", " ", " ", " ",
" ", " ", " ", " ",
"delete ", "read_control", "write_dac", "write_owner",
"synchronize ", " ", " "," ",
"access_system_security", "maximum_allowed", " "," ",
"generic_all", "generic_execute", "generic_write","generic_read"};
foreach(managementbaseobject mbo in daclobject)
{
console.writeline("-------------------------------------------------");
console.writeline("mask: {0:x} - aceflags: {1} - acetype: {2}", mbo["accessmask"], mbo["aceflags"], mbo["acetype"]);
// access allowed/denied ace
if(mbo["acetype"].tostring() == "1")
console.writeline("denied ace type");
else
console.writeline("allowed ace type");
// dump trustees
managementbaseobject trustee = ((managementbaseobject)(mbo["trustee"]));
console.writeline("name: {0} - domain: {1} - sid {2}/n",
trustee.properties["name"].value,
trustee.properties["domain"].value,
trustee.properties["sidstring"].value);
// dump ace mask in readable form
uint32 mask = (uint32)mbo["accessmask"];
int[] m = {(int)mask};
bitarray ba = new bitarray(m);
int i = 0;
ienumerator baenum = ba.getenumerator();
while ( baenum.movenext() )
{
if((bool)baenum.current)
console.writeline( "/t[{0}]", filedesc[i]);
i++;
}
}
}
static void dumpownerproperties(propertydatacollection owner)
{
console.writeline("=============== owner properties ========================");
console.writeline();
console.writeline("domain {0} /tname {1}",owner["domain"].value, owner["name"].value);
console.writeline("sid /t{0}",owner["sidstring"].value);
console.readline();
}
}
//