C# - Munkaállomással kapcsolatos információk lekérdezése

forráskód letöltése
Amennyiben a számítógépünk egy helyi hálózat munkaállomása, akkor NETAPI32.DLL állományban található metódusok segítségével képesek vagyunk információkat szerezni a többi munkaállomásról. Lekérdezhetők az adott számítógép felhasználói, módosítások alkalmazhatók ebben az információhalmazban. A DLL más metódusaival pedig a saját munkaállomásunkról kaphatunk érdekes és hasznos információkat. Lekérdezhető többek közt az aktuálisan bejelentkezett felhasználó neve vagy domain neve, melyhez a számítógép tartozik. Cikkünkben ezeket a metódusokat tárjuk fel részletesen.
A mellékelt alkalmazásban három információt kérdezünk le: a bejelentkezett felhasználó neve, a számítógép neve és a tartománynév, melyhez a munkaállomás tartozik. Ez utóbbi esetben, ha a számítógép nem része valamilyen tartománynak, akkor a munkacsoport nevét kapjuk vissza, melyhez alapértelmezésben tartozik.
A metódusok menedzselt deklarációit, és az azokat meghívó statikus metódusokat a Win32 osztályban találjuk.
NetWkstaUserGetInfo metódus
A metódus segítségével tudjuk meghatározni, hogy éppen melyik felhasználó van bejelentkezve. Jól jöhet ez az ismeret akkor, ha alkalmazásukat csak bizonyos felhasználók bejelentkezésekor szeretnénk futtatni, egyébként nem.
A metódus eredeti deklarációja a következő:
NetWkstaUserGetInfo
NetWkstaUserGetInfo(
string reserved, int level, out IntPtr bufptr
);
A metódussal tehát – a bejelentkezett felhasználó kontextusában meghívva – lekérdezhető a bejelentkezett felhasználó neve.
Paraméterek
string reserved
Foglalat, NULL értékre kell állítani.
int level
A paraméter segítségével adható meg, hogy milyen részletességű információt szeretnénk kapni a bejelentkezett felhasználóról. Az itt megadott érték 0, 1 és 1101 lehet, melyek mindegyike más-más rekordtípus megadását követeli meg a harmadik paraméterben.
out IntPtr bufptr
Egy mutató, mely jelen esetben egy WKSTA_USER_INFO_0 típusú struktúrára mutat. Ebben kapjuk vissza a felhasználó nevét.
Visszatérési érték
Amennyiben a művelet sikeres volt, akkor nulla.
A metódust a GetLoggedUser függvényben hívjuk meg. A meghíváshoz szükséges struktúra deklarációja a következő:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct WKSTA_USER_INFO_0
{
  public string wkui0_username;
}
Első lépésben létrehozunk egy mutatót, melyet majd átadunk a metódusnak, és egy struktúra-objektumot:
IntPtr ptr = IntPtr.Zero;
WKSTA_USER_INFO_0 user = new WKSTA_USER_INFO_0();
Meghívjuk a metódust, majd a mutató által jelzett memóriaterületről beolvassuk az információt.
NetWkstaUserGetInfo(null,1,out ptr);
user = (WKSTA_USER_INFO_0)Marshal.PtrToStructure(ptr, typeof(WKSTA_USER_INFO_0));
Végül a NetApiBufferFree metódussal felszabadítjuk a lefoglalt memóriaterületet.
NetApiBufferFree(ptr);
NetWkstaGetInfo metódus
A metódus egyszerre szolgáltatja a számítógép nevét és a tartománynevet. Deklarációja a következő:
NetWkstaGetInfo
NetWkstaGetInfo(
string servername, int level, out IntPtr bufptr
);
A metódus visszaadja a fenti információkat a LAN egy tetszőleges munkaállomásán. Ehhez az első paraméterben kell specifikálni a munkaállomást.
Paraméterek
string servername
A munkaállomás neve. NULL esetén a lokális rendszert veszi alapul a metódus. Amennyiben egy munkaállomás nevét adjuk meg, kezdjük a karakterláncot a „\\” karakterekkel.
int level
A paraméter segítségével adható meg, hogy milyen részletességű információt szeretnénk kapni a bejelentkezett felhasználóról. Az itt megadott érték 100, 101 és 102 lehet, melyek mindegyike más-más rekordtípus megadását követeli meg a harmadik paraméterben.
out IntPtr bufptr
Egy mutató, mely jelen esetben egy WKSTA_INFO_100 típusú struktúrára mutat. Ebben kapjuk vissza a gépnevet és a tartománynevet.
Visszatérési érték
Amennyiben a művelet sikeres volt, akkor nulla.
A metódust a fentiekhez hasonlóan hívjuk meg a GetComputerName és a GetDomainName metódusokban minkét információ lekérdezéséhez, csupán a kapott struktúra más-más mezőjét olvassuk ki.
Első lépés a területfoglalás és az objektum létrehozása.
IntPtr ptr = IntPtr.Zero;
WKSTA_INFO_100 info = new WKSTA_INFO_100();
Majd a metódushívás és az információ lekérdezése.
NetWkstaGetInfo(null,100,out ptr);
info = (WKSTA_INFO_100)Marshal.PtrToStructure(ptr, typeof(WKSTA_INFO_100));
A tartomány lekérdezéséhez a wki100_langroup mezőt, míg a számítógép nevének lekérdezéséhez a wki100_computername mezőt.
result = info.wki100_langroup;
...
Végül a NetApiBufferFree metódussal itt is felszabadítjuk a lefoglalt memóriaterületet.
NetApiBufferFree(ptr);