[DllImport("Netapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int NetServerGetInfo(
string serverName,
int level,
out IntPtr pSERVER_INFO_XXX);
Declare Function NetServerGetInfo Lib "netapi32.dll" (ByVal ServerName As String, _
ByVal Level As Integer, ByRef ptrBuff As IntPtr) As Integer
[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;
}
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
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.
Please add some!
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
[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;
}
private DOMAIN_CONTROLLER_INFO domainInfo;
private SERVER_INFO_101 serverInfo;
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));
if(NetServerGetInfo(domainInfo.DomainControllerName, 101, out pSI)==0)
{
serverInfo = (SERVER_INFO_101)Marshal.PtrToStructure(
pSI, typeof(SERVER_INFO_101));
}
}
}
finally
{
NetApiBufferFree(pDCI);
NetApiBufferFree(pSI);
}
Do you know one? Please contribute it!