[DllImport("Netapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern int NetDfsGetInfo(
[MarshalAs(UnmanagedType.LPWStr)] string DfsEntryPath, // DFS entry path for the volume
[MarshalAs(UnmanagedType.LPWStr)] string ServerName, // This parameter is currently ignored and should be NULL
[MarshalAs(UnmanagedType.LPWStr)] string ShareName, // This parameter is currently ignored and should be NULL.
int Level, // Level of information requested
out IntPtr Buffer // API allocates and returns buffer with requested info
);
<DllImport("Netapi32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)> _
Public Function NetDfsGetInfo( _
<MarshalAs(UnmanagedType.LPWStr)> ByVal entryPath As String, _
<MarshalAs(UnmanagedType.LPWStr)> ByVal serverName As String, _
<MarshalAs(UnmanagedType.LPWStr)> ByVal shareName As String, _
ByVal level As Integer, _
ByRef buffer As IntPtr) As Integer
End Function
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure DFS_INFO_3
<MarshalAs(UnmanagedType.LPWStr)> Dim EntryPath As String
<MarshalAs(UnmanagedType.LPWStr)> Dim Comment As String
Dim State As UInt32
Dim NumberOfStorages As UInt32
Dim Storages As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure DFS_STORAGE_INFO
Dim state As Int32
<MarshalAs(UnmanagedType.LPWStr)> Dim ServerName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim ShareName As String
End Structure
Remember to free buffer, see NetApiBufferFree
static void Main(string[] args)
{
IntPtr buf;
if (args[0] != "")
{
int res=NetDfsGetInfo(args[0], null, null, 4, out buf);
if (res == 0)
{
try
{
DFS_INFO_4 info = (DFS_INFO_4)Marshal.PtrToStructure(buf, typeof(DFS_INFO_4));
Console.WriteLine("{0}, {1}, {2} ", info.EntryPath, info.Comment, info.NumberOfStorages);
for (int i = 0; i < info.NumberOfStorages; i++)
{
IntPtr pStorage = new IntPtr(info.Storage.ToInt64() + i * Marshal.SizeOf(typeof(DFS_STORAGE_INFO)));
DFS_STORAGE_INFO storage = (DFS_STORAGE_INFO)Marshal.PtrToStructure(pStorage, typeof(DFS_STORAGE_INFO));
Console.WriteLine(" {0}, {1}, {2} ", storage.ServerName, storage.ShareName, storage.State);
}
}
finally
{
NetApiBufferFree(buf);
}
}
}
}
Do you know one? Please contribute it!