NetServerGetInfo (netapi32)
Last changed: dahall68-65.129.36.102

.
Summary
Retrieves the current OS configuration information of the specified server

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

C# User-Defined Types:

[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;
}

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
{
    [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);
}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation