HyperLink


Bejelentkezés
E-mail: 
Jelszó: 






Skip Navigation Links
 

A helyi hálózat tetszőleges gépén futó operációs rendszer lekérdezése


Példaprogram letöltése

8728 bájt

A helyi hálózat számítógépeiről a legváltozatosabb információk kigyűjthetők, legyen szó számítógépnévről, felhasználókról, vagy akár az adott számítógépeken futó operációs rendszerről. Ezeket az információkat API metódusok segítségével kérdezhetjük le, melyek implementációi Windows NT verziótól kezdődően a NETAPI32.DLL állományban kaptak helyet. Cikkünkben bemutatjuk, hogy az operációs rendszer típusára vonatkozó információ megszerzéséhez melyik metódust kell használnunk, és hogyan kell paramétereznünk azt.

A megoldás taglalása előtt megemlítendő, hogy amennyiben a mellékletalkalmazást Windows 98 rendszeren futtatjuk, akkor ott nem található meg a NETAPI32.DLL állomány. Ott a SVRAPI.DLL dinamikusan szerkeszthető könyvtárra kell hivatkozni.
Az adott számítógép operációs rendszerének típusát a NetServerGetInfo API metódussal kérdezhetjük le, de nem közvetlenül. A metódushívás után a paraméterben kapott információból lehet bizonyos következtetéseket levonni erre vonatkozóan. Lássuk, hogyan deklarálható a menedzselt kódban a metódus.
NetServerGetInfo
Osztály:
int NetServerGetInfo(
[MarshalAs(UnmanagedType.LPTStr)] string lpServerName, int dwLevel, out IntPtr lpBuffer
);
A metódussal – attól függően, hogy milyen jellegűre van szükségünk – információkat kaphatunk a LAN egy számítógépéről. Az információ természetét a második paraméterben megadott számmal jelezhetjük. Ennek megfelelően kapunk vissza adattípusokat.
Paraméterek
[MarshalAs(UnmanagedType.LPTStr)] string lpServerName
A LAN adott számítógépének nevét tartalmazó karakterlánc.
int dwLevel
Az információ típusára vonatkozó egész szám, mely meghatározza, hogy milyen típusú struktúra kapható eredményül, amennyiben meghívtuk a metódust.
out IntPtr lpBuffer
A cégeredmény memóriaterületére mutató pointer.
Visszatérési érték
Amennyiben a lekérdezés sikerült, akkor a visszatérési értéke nulla.
A második paraméterben megadható egész szám háromféle lehet, melyekhez három struktúratípus tartozik.
Szám Struktúra
100 SERVER_INFO_100
101 SERVER_INFO_101
102 SERVER_INFO_102
A mellékelt példában most a 101 számot adjuk át a második paraméterben, és a SERVER_INFO_101 típusban kapjuk meg az eredményt. A struktúra deklarációja a következő:
[System.Runtime.InteropServices.StructLayoutAttribute (LayoutKind.Sequential, CharSet=CharSet.Auto)]
private struct SERVER_INFO_101 
{ 
Az operációs rendszer azonosítója.
  public int dwPlatformID;
A számítógép neve.
  public System.IntPtr lpszServerName;
Verzió főszáma.
  public int dwVersionMajor; 
Verzió alszáma.
  public int dwVersionMinor;
  public int dwType;
  public int lpszComment;
}
A paraméterként megadott mutatót a NETAPI32.DLL egy másik metódusával kell felszabadítanunk a megoldás után, melynek deklarációját is a Win32 osztályunk tartalmazza.
[DllImport("netapi32.dll")]
protected static extern int NetApiBufferFree(IntPtr lpBuffer);
A Form szövegmezőjének kitöltésekor és a nyomógomb megnyomásakor meghívjuk az említett osztály statikus GetServerType metódusát, melyben elvégezzük az API hívását, és a megoldást a metódus visszatérési értéke szolgáltatja.
Az első lépés, hogy példányosítjuk a struktúrát, valamint létrehozzuk a paraméterben átadandó mutatót.
SERVER_INFO_101 si = new SERVER_INFO_101();
IntPtr ptr = IntPtr.Zero;
Amennyiben a metódushívás eredménye nulla, akkor kiértékeljük az eredményt.
if (NetServerGetInfo(name,101,out ptr) == 0)
{
Ha a kapott mutató nem mutat sehová, akkor az arra utal, hogy a számítógépen Windows 98 vagy 95 fut.
Ha viszont a mutató létező területre mutat, a mutató által jelzett területről beolvassuk az információkat tartalmazó adatokat a struktúrába. Amennyiben a verzió főszáma 4 vagy annál kisebb, akkor az adott gépen Windows NT fut.
  if (si.dwVersionMajor <= 4)
  {
    result = "Windows NT";
  }
Egyébként megvizsgáljuk az alszámot is. Amennyiben az nulla, akkor a rendszer Windows 2000.
  else{
    if (si.dwVersionMinor == 0)
    {
      result = "Windows 2000";
    }
Amennyiben 1, akkor pedig Windows XP-ről beszélhetünk.
    else if (si.dwVersionMinor == 1)
    {
       result = "Windows XP";
    }
  }
  ...
Utolsó lépés a memóriaterület felszabadítása.
NetApiBufferFree(ptr);
Ha a kérdéses rendszer nem elérhető, például mert nincs a számítógép bekapcsolva, akkor azt is jelezzük.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 812. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2010 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |