Unmanged GetSecurityInfo liefert immer den Wert 6 zurück

28/05/2010 - 10:02 von AndyL | Report spam
Hallo,

ich habe folgendes Problem. Ich will einen SDDL String für eine Datei
auslesen, die einen làngeren Pfad als 256 Zeichen hat (Deswegen kannich die
.NET funktionen nicht verwenden).
Dazu nutze ich die unmanged Function GetSecurityInfo und FindFirstHandle
Mit der FindFirstHandle hole ich mir den Filehandle und dann will ich mit
GetSecurityInfo den SecurityDescriptor abholen.
Aber irgendwie liefert mir die GetSecurityInfo Methode immer den Wert 6
zurück. Leider konnte ich bis jetzt noch nicht feststellen was der Error_Code
6 bedeutet.
Kann mir da jemand helfen?

Ich habe folgende funktion erstellt:

private struct WIN32_FIND_DATA
{
public FileAttributes dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public int nFileSizeHigh;
public int nFileSizeLow;
public int dwReserved0;
public int deReserved1;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=MAX_ALTERNATE)]
public string cAlternate;
}

[DllImport("advapi32.dll", SetLastError = true)]
static extern uint GetSecurityInfo(IntPtr handle, SE_OBJECT_TYPE
ObjectType, SECURITY_INFORMATION SecurityInfo, out IntPtr pSidOwner, out
IntPtr pSidGroup, out IntPtr pDacl, out IntPtr pSacl, out IntPtr
pSecurityDescriptor);

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA
lpFindFileData);

public static string GetSDDL(string path)
{
IntPtr findHandle;
IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
IntPtr ownerSid;
IntPtr groupSid;
IntPtr dacl;
IntPtr sacl;
IntPtr securityDescriptor = new IntPtr(-1);
IntPtr stringSecurityPointer;
long stringSecurityLen;
string stringSecurityDescriptor = null;
WIN32_FIND_DATA findData;

findHandle = FindFirstFile(path, out findData);
if (findHandle != INVALID_HANDLE_VALUE)
{
uint returnValue = 0;

returnValue = GetSecurityInfo(
findHandle,
SE_OBJECT_TYPE.SE_FILE_OBJECT,
SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION |
SECURITY_INFORMATION.DACL_SECURITY_INFORMATION,
out ownerSid,
out groupSid,
out dacl,
out sacl,
out securityDescriptor);
if (ConvertSecurityDescriptorToStringSecurityDescriptor(
securityDescriptor,
SDDL_REVISION,
SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION |
SECURITY_INFORMATION.DACL_SECURITY_INFORMATION,
out stringSecurityPointer,
out stringSecurityLen))
{
stringSecurityDescriptor=
Marshal.PtrToStringAuto(stringSecurityPointer);
}
}
LocalFree(securityDescriptor);
return stringSecurityDescriptor;
}


Danke für eure Hilfe
Andy aus Weinheim
 

Lesen sie die antworten

#1 Thomas Scheidegger
28/05/2010 - 10:15 | Warnen spam
Hallo Andy

Mit der FindFirstHandle hole ich mir den Filehandle



beachte, 'FindFirstFile'
liefert kein File-Handle, sondern ein FindNext-Handle!




Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen