DFS in c# auslesen

14/01/2009 - 10:17 von AndyL | Report spam
Hallo,

ich versuche verzweifelt ein DFS mit C# auszulesen. Da ich mit WMI Problem
habe wollte ich das DFS mit dem NetDfsEnum auslesen. Leider wenn ich versuche
das DFS target array lesen will bekomme ich einen Fehler:
FataExecutionengineError und ich weiss nicht warum.
hier mein code:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DFS_INFO_4
{
[MarshalAs(UnmanagedType.LPWStr)]
public string EntryPath;
[MarshalAs(UnmanagedType.LPWStr)]
public string Comment;
public UInt32 State;
public UInt64 Timeout;
public Guid GUID;
public int NumberOfStorages;
public IntPtr Storage;
public DFS_STORAGE_INFO[] GetStorage()
{
Int64 ptr = Storage.ToInt64();
DFS_STORAGE_INFO[] ret = new DFS_STORAGE_INFO[NumberOfStorages];
for (int i = 0; i < NumberOfStorages; i++)
{
ret[i] =
(DFS_STORAGE_INFO)Marshal.PtrToStructure((IntPtr)ptr,
typeof(DFS_STORAGE_INFO));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// hier passiert der Fehler ich wenn ich mit Marshal.PtrToStructure auf den
//Pointer zu greife. Warum???
ptr += Marshal.SizeOf(typeof(DFS_STORAGE_INFO));
}
return ret;
}
}

public class DfsManagement
{
[DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
static extern int NetDfsEnum(
[MarshalAs(UnmanagedType.LPWStr)] string DfsName,
int Level,
int PrefMaxLen,
out IntPtr Buffer,
[MarshalAs(UnmanagedType.I4)] out int EntriesRead,
[MarshalAs(UnmanagedType.I4 )] ref int ResumeHandle
);
public void DfsNamespace EnumDfs(string dfsPath)
{
IntPtr linkBuffer;
int iLinkCounter;
int iContinueHandle;
NetDfsEnum(dfsPath,4,-1, out linkBuffer,out iLinkCounter,ref iContinueHandle);
for (int i = 0; i < iContinueHandle, i++)
{
int iHelp = i;
NetDfsEnum(dfsPath, 4, -1, out linkBuffer, out iLinkCounter, ref iHelp);
DFS_INFO_4 di = (DFS_INFO_4)Marshal.PtrToStructure(linkBuffer,
typeof(DFS_INFO_4));
DFS_STORAGE_INFO[] dsi = di.GetStorage()
}
}
}


Kann mir hierbei jemand helfen?
Warum stimmt die Strukture nicht ?? Laut MSDN habe ich hoffentlich die
DFs_STORAGE_INFO struktur richtig definiert.

Grüße Andy Lucas
 

Lesen sie die antworten

#1 AndyL
14/01/2009 - 10:37 | Warnen spam
Hallo,

kaum die mail geschrieben und schon die Lösung gefunden:
Der Fehler war in:
DFS_STORAGE_INFO struct
das State field war falsch deklariert: es muss als:
ulong state;

definiert werden.
Aber jetzt habe ich immer noch das Problem, dass im NumberOfStorages
Bullshit drin steht.

Hat da jemand eine Idee???

Gruß andy

"AndyL" wrote:

Hallo,

ich versuche verzweifelt ein DFS mit C# auszulesen. Da ich mit WMI Problem
habe wollte ich das DFS mit dem NetDfsEnum auslesen. Leider wenn ich versuche
das DFS target array lesen will bekomme ich einen Fehler:
FataExecutionengineError und ich weiss nicht warum.
hier mein code:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DFS_INFO_4
{
[MarshalAs(UnmanagedType.LPWStr)]
public string EntryPath;
[MarshalAs(UnmanagedType.LPWStr)]
public string Comment;
public UInt32 State;
public UInt64 Timeout;
public Guid GUID;
public int NumberOfStorages;
public IntPtr Storage;
public DFS_STORAGE_INFO[] GetStorage()
{
Int64 ptr = Storage.ToInt64();
DFS_STORAGE_INFO[] ret = new DFS_STORAGE_INFO[NumberOfStorages];
for (int i = 0; i < NumberOfStorages; i++)
{
ret[i] =
(DFS_STORAGE_INFO)Marshal.PtrToStructure((IntPtr)ptr,
typeof(DFS_STORAGE_INFO));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// hier passiert der Fehler ich wenn ich mit Marshal.PtrToStructure auf den
//Pointer zu greife. Warum???
ptr += Marshal.SizeOf(typeof(DFS_STORAGE_INFO));
}
return ret;
}
}

public class DfsManagement
{
[DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
static extern int NetDfsEnum(
[MarshalAs(UnmanagedType.LPWStr)] string DfsName,
int Level,
int PrefMaxLen,
out IntPtr Buffer,
[MarshalAs(UnmanagedType.I4)] out int EntriesRead,
[MarshalAs(UnmanagedType.I4 )] ref int ResumeHandle
);
public void DfsNamespace EnumDfs(string dfsPath)
{
IntPtr linkBuffer;
int iLinkCounter;
int iContinueHandle;
NetDfsEnum(dfsPath,4,-1, out linkBuffer,out iLinkCounter,ref iContinueHandle);
for (int i = 0; i < iContinueHandle, i++)
{
int iHelp = i;
NetDfsEnum(dfsPath, 4, -1, out linkBuffer, out iLinkCounter, ref iHelp);
DFS_INFO_4 di = (DFS_INFO_4)Marshal.PtrToStructure(linkBuffer,
typeof(DFS_INFO_4));
DFS_STORAGE_INFO[] dsi = di.GetStorage()
}
}
}


Kann mir hierbei jemand helfen?
Warum stimmt die Strukture nicht ?? Laut MSDN habe ich hoffentlich die
DFs_STORAGE_INFO struktur richtig definiert.

Grüße Andy Lucas

Ähnliche fragen