Introduction
Needing to list servers for a project I was working on, Marty Cerisano's
article A C# Server
Drop-down Control seemed perfect. Downloading and attempting to compile left me a
little frustrated. The original code appears to be developed under a BETA version
of Visual Studio .NET and would not compile under the released version.
(MarshalAs.LPVoid
was not defined, this has been updated in his May 30, 2002 release
of his code).
I decided to rewrite the code and make it a bit more modular. I separated the code to
enumerate the servers to it's own class. I removed the use of pointers and removed the
use of the unsafe
block.
The tricky part I found was removing the pointer use. Calculating the offset in the
structure and using the Marshal.PtrToStructure()
method to get correct data took some
digging into the class library documentation.
There are three classes and an enumeration. They are:
-
ServerType
- Enumeration listing possible server types, such as
SQL Server or Terminal Server. ServerType
s can be logically
OR'ed, i.e. the ServerType
has the Flags
attribute.
-
Servers
- Collection of servers of specified type. Implements
IEnumerable
which allows foreach
to be used.
-
ServerEnumerator
- Enumerator to loop over the list of servers.
-
ServerComboBox
- Example ComboBox control that uses the other classes.
Notes
- The code will not allow you to get a list based on an AND conjunction. For example,
you cannot ask for all SQL Servers that also are Terminal Servers. Attempting this, you will only get back a list of all server that are SQL Servers OR Terminal Servers. (It may be true that your SQL Server is also Terminal Server). You will have
to manually query for each type and perform the intersection operation manually.
- The
AutoRefresh
property will not automatically rescan the network. Setting
AutoRefresh
to true
will cause any changes to the
ServerType
property to automatically call the Refresh()
method. This is NOT an auto update setting.
Running the demo application
- Download both the source and the demo application.
- Extract each zip file to the same parent folder.
- Open the the source's solution and build.
- Open the demo's solution, build and run.
Using the Servers collection
using System;
using NetworkManagement;
Servers servers = new Servers( ServerType.SQLServer );
foreach (String name in servers)
{
Console.WriteLine(name);
}
Servers servers = new Servers( ServerType.DomainEnum );
IEnumerator i = servers.GetEnumerator()
while ( i.MoveNext() )
{
string domainName = (string) i.Current;
Console.WriteLine(domainName);
}
Using the ServerComboBox
using System;
using NetworkManagement;
public class ServerComboBoxForm : System.Windows.Forms.Form
{
private ServerComboBox sCombo1;
private void InitializeComponent()
{
sCombo1 = new NetworkManagement.ServerComboBox();
sCombo1.AutoRefresh = true;
sCombo1.ServerType = ServerType.DomainEnum;
}
}
Conclusion
This is a simple example of calling Windows API functions. Included is a sample
application that demonstrates using the classes.
Changes
November 18, 2003
- Fixed the
ServerType
enumeration to have CLR base type of long. Should fix problem VB.NET users were experiencing.
- Remove restriction on using unsafe code by implementing Richard_D's suggestion. Now uses Marshal class instead of unsafe block.
- Compiled binaries are for .NET 1.1. I do not have a .NET 1.0 system available to compile, sorry.
- Samples are no longer bound to SourceSafe. Folder structure cleaned up.