случайно наткнулся на пример с NetServerEnum это по поводу п.2. насчет AD там все просто вроде бы. берешь и делаешь запрос с условием вроде "(objectClass=computer)"public enum ServerTypeEnum
{
steNone = 0,
steWorkstation = 0x00000001,
steAll = 0x00000002,
steSQLServer = 0x00000004,
steDomainController = 0x00000008
}
[sysimport(dll="netapi32.dll")]
private static extern void
NetApiBufferFree([marshal(UnmanagedType.U4)]uint bufptr);
[sysimport(dll="netapi32.dll")]
unsafe private static extern uint
NetServerEnum([marshal(UnmanagedType.LPWStr)] string ServerName,
uint level,
[marshal(UnmanagedType.LPVoid)]uint* bufptr,
uint prefmaxlen,
ref uint entriesread,
ref uint totalentries,
uint servertype,
[marshal(UnmanagedType.LPWStr)] string domain,
uint resume_handle);
[System.Runtime.InteropServices.StructLayoutAttribute
(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public struct SERVER_INFO_101
{
public int dwPlatformID;
public int lpszServerName;
public int dwVersionMajor;
public int dwVersionMinor;
public int dwType;
public int lpszComment;
}
protected void GetServers()
{
string servername = null;
string domain = "YourDomainName";
uint level = 101, prefmaxlen = 0xFFFFFFFF, entriesread = 0,
totalentries = 0, resume_handle = 0;
cboServers.Items.Clear();
unsafe
{
//get a pointer to the server info structure
SERVER_INFO_101* si = null;
SERVER_INFO_101* pTmp; //temp pointer for use when looping
//through returned (pointer) array
//this api requires a pointer to a byte array...
//which is actually a pointer to an array of SERVER_INFO_101
structures
//If the domain parameter is NULL, the primary domain is
implied.
uint nRes = NetServerEnum(servername, level,
(uint *) &si, prefmaxlen, ref entriesread, ref
totalentries,
(uint)_ServerType, domain, resume_handle);
if (nRes == 0)
{
if ((pTmp = si) != null) //assign the temp pointer
{
for (int i = 0; i < entriesread; i++) //loop through
the entries
{
try
{
//the lpszServerName member of the structure
contains a pointer to
//the server name string...marshal the pointer
from unmanaged
//memory to a managed string
cboServers.Items.Add(Marshal.PtrToStringAuto(pTmp->lpszServerName));
}
catch (Exception e)
{
MessageBox.Show(e.Message) ;
}
pTmp++; // increment the
pointer...essentially move to the next
// structure in the array
}
}
}
NetApiBufferFree((uint)si);
}
}