Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
To create a page in a module other than netapi32, prefix the name with the module name and a period.
NetServerGetInfo (netapi32)
.
C# Signature:
[DllImport("Netapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int NetServerGetInfo(
string serverName,
int level,
out IntPtr pSERVER_INFO_XXX);
VB Signature:
Declare Function NetServerGetInfo Lib "netapi32.dll" (ByVal ServerName As String, _
ByVal Level As Integer, ByRef ptrBuff As IntPtr) As Integer
public enum ServerPlatform
{
DOS = 300,
OS2 = 400,
NT = 500,
OSF = 600,
VMS = 700
public int PlatformId;
[MarshalAs(UnmanagedType.LPTStr)]
public string Name;
public int VersionMajor;
public int VersionMinor;
public int Type;
[MarshalAs(UnmanagedType.LPTStr)]
public string Comment;
}
[StructLayout(LayoutKind.Sequential)]
public struct SERVER_INFO_100
VB.NET User-Defined Types:
Here is how you would define the SERVER_INFO_102 structure (100 and 101 can be defined in a similar way):
<StructLayout(LayoutKind.Sequential)> _
Private Structure SERVER_INFO_102
Dim sv102_platform_id As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_name As String
Dim sv102_version_major As Integer
Dim sv102_version_minor As Integer
Dim sv102_type As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_comment As String
Dim sv102_users As Integer
Dim sv102_disc As Integer
Dim sv102_hidden As Boolean
Dim sv102_announce As Integer
Dim sv102_anndelta As Integer
Dim sv102_licenses As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_userpath As String
End Structure
Notes:
1. ptrBuff is a pointer to a structure of type SERVER_INFO_100, SERVER_INFO_101 or SERVER_INFO_102.
2. Pass in vbNullString as the first parameter if you are querying the local machine. Otherwise, just pass in the name of the machine.
Tips & Tricks:
Please add some!
VB.NET Sample Code:
Private Sub GetServerName( )
Dim ptrBuff As IntPtr
Dim strServerInfo As SERVER_INFO_102
Dim lRetCode As Integer
lRetCode = NetServerGetInfo(vbNullString, 102, ptrBuff)
strServerInfo = CType(Marshal.PtrToStructure(ptrBuff, GetType(SERVER_INFO_102)), SERVER_INFO_102)
Debug.WriteLine(strServerInfo.sv102_version_major)
Debug.WriteLine(strServerInfo.sv102_version_minor)
End Sub
C# Sample Code:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct DOMAIN_CONTROLLER_INFO
{
public ServerPlatform PlatformId;
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
public string Name;
}
[StructLayout(LayoutKind.Sequential)]
public struct SERVER_INFO_101
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainControllerName;
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainControllerAddress;
public uint DomainControllerAddressType;
public Guid DomainGuid;
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainName;
[MarshalAs(UnmanagedType.LPTStr)]
public string DnsForestName;
public uint Flags;
[MarshalAs(UnmanagedType.LPTStr)]
public string DcSiteName;
[MarshalAs(UnmanagedType.LPTStr)]
public string ClientSiteName;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct SERVER_INFO_101
{
public ServerPlatform PlatformId;
[MarshalAs(UnmanagedType.LPWStr)]
public string Name;
public int VersionMajor;
public int VersionMinor;
public ServerTypes Type;
[MarshalAs(UnmanagedType.LPWStr)]
public string Comment;
public int PlatformId;
[MarshalAs(UnmanagedType.LPTStr)]
public string Name;
public int VersionMajor;
public int VersionMinor;
public int Type;
[MarshalAs(UnmanagedType.LPTStr)]
public string Comment;
}
[StructLayout(LayoutKind.Sequential)]
public struct SERVER_INFO_102
{
public ServerPlatform PlatformId;
[MarshalAs(UnmanagedType.LPWStr)]
public string Name;
public int VersionMajor;
public int VersionMinor;
public ServerTypes Type;
[MarshalAs(UnmanagedType.LPWStr)]
public string Comment;
public int MaxUsers;
public int AutoDisconnectMinutes;
[MarshalAs(UnmanagedType.Bool)]
public bool Hidden;
public int NetworkAnnounceRate;
public int NetworkAnnounceRateDelta;
public int UsersPerLicense;
[MarshalAs(UnmanagedType.LPWStr)]
public string UserDirectoryPath;
}
VB.NET User-Defined Types:
Here is how you would define the SERVER_INFO_102 structure (100 and 101 can be defined in a similar way):
<StructLayout(LayoutKind.Sequential)> _
Private Structure SERVER_INFO_102
Dim sv102_platform_id As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_name As String
Dim sv102_version_major As Integer
Dim sv102_version_minor As Integer
Dim sv102_type As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_comment As String
Dim sv102_users As Integer
Dim sv102_disc As Integer
Dim sv102_hidden As Boolean
Dim sv102_announce As Integer
Dim sv102_anndelta As Integer
Dim sv102_licenses As Integer
<MarshalAs(UnmanagedType.LPWStr)> Dim sv102_userpath As String
End Structure
IntPtr pDCI = IntPtr.Zero;
IntPtr pSI = IntPtr.Zero;
try
{
if(DsGetDcName(null, null, null, null, 0, out pDCI)==0)
{
domainInfo = (DOMAIN_CONTROLLER_INFO)Marshal.PtrToStructure(
pDCI, typeof(DOMAIN_CONTROLLER_INFO));
Notes:
1. ptrBuff is a pointer to a structure of type SERVER_INFO_100, SERVER_INFO_101 or SERVER_INFO_102.
2. Pass in vbNullString as the first parameter if you are querying the local machine. Otherwise, just pass in the name of the machine.
Private Sub GetServerName( )
Dim ptrBuff As IntPtr
Dim strServerInfo As SERVER_INFO_102
Dim lRetCode As Integer
lRetCode = NetServerGetInfo(vbNullString, 102, ptrBuff)
strServerInfo = CType(Marshal.PtrToStructure(ptrBuff, GetType(SERVER_INFO_102)), SERVER_INFO_102)
Debug.WriteLine(strServerInfo.sv102_version_major)
Debug.WriteLine(strServerInfo.sv102_version_minor)
End Sub
C# Sample Code (1):
[DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int NetServerGetInfo(string serverName, int level, out IntPtr pSERVER_INFO_XXX);
// Wrapper function to allow passing of structure and auto-find of level if structure contains it.
public static T NetServerGetInfo<T>(string serverName = null, int level = 0) where T : struct
{
if (level == 0)
level = int.Parse(System.Text.RegularExpressions.Regex.Replace(typeof(T).Name, @"[^\d]", ""));
IntPtr ptr = IntPtr.Zero;
try
{
int ret = NetServerGetInfo(serverName, level, out ptr);
if (ret != 0)
throw new System.ComponentModel.Win32Exception(ret);
return (T)Marshal.PtrToStructure(ptr, typeof(T));
}
finally
{
if (ptr != IntPtr.Zero)
NetApiBufferFree(ptr);
}
}
public static void Main()
{
var serverInfo = NetServerGetInfo<SERVER_INFO_101>("SVR0123");
Console.WriteLine($"Name: {serverInfo.Name}; Version: {serverInfo.VersionMajor}.{serverInfo.VersionMinor}");
}
C# Sample Code (2):
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct DOMAIN_CONTROLLER_INFO
{
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainControllerName;
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainControllerAddress;
public uint DomainControllerAddressType;
public Guid DomainGuid;
[MarshalAs(UnmanagedType.LPTStr)]
public string DomainName;
[MarshalAs(UnmanagedType.LPTStr)]
public string DnsForestName;
public uint Flags;
[MarshalAs(UnmanagedType.LPTStr)]
public string DcSiteName;
[MarshalAs(UnmanagedType.LPTStr)]
public string ClientSiteName;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct SERVER_INFO_101
{
public int PlatformId;
[MarshalAs(UnmanagedType.LPTStr)]
public string Name;
public int VersionMajor;
public int VersionMinor;
public int Type;
[MarshalAs(UnmanagedType.LPTStr)]
public string Comment;
}
helpful tips or sample code to share for using this API in managed code?
corrections to the existing content?
variations of the signature you want to share?
additional languages you want to include?
Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).