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
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.
ServerTypes can be logically
OR'ed, i.e. the
ServerType has the
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.
- 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.
AutoRefresh property will not automatically rescan the network. Setting
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
Servers servers = new Servers( ServerType.SQLServer );
foreach (String name in servers)
Servers servers = new Servers( ServerType.DomainEnum );
IEnumerator i = servers.GetEnumerator()
while ( i.MoveNext() )
string domainName = (string) i.Current;
Using the ServerComboBox
public class ServerComboBoxForm : System.Windows.Forms.Form
private ServerComboBox sCombo1;
private void InitializeComponent()
sCombo1 = new NetworkManagement.ServerComboBox();
sCombo1.AutoRefresh = true; sCombo1.ServerType = ServerType.DomainEnum;
This is a simple example of calling Windows API functions. Included is a sample
application that demonstrates using the classes.
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.