C# - Hálózati erőforrások lekérdezése

Hálózati meghajtó-műveletek metódusai 2. rész

forráskód letöltése
Cikksorozatunknak ebben a számában folytatjuk az MPR.DLL dinamikusan szerkeszthető könyvtár metódusainak bemutatását. Ebben a számban megismerkedhetünk azokkal a függvényekkel, melyekkel kigyűjthetjük a helyi hálózaton fellelhető, megosztott erőforrásokat. A cikkben bemutatjuk a metódusok menedzselt deklarációit, paramétereiket és használatunk módját.
Ebben a számban három metódust mutatunk be, melyekkel minden nehézség nélkül kigyűjthetjük a helyi hálózat erőforrásait. Ezek a metódusok a következők: WNetEnumResource, WNetOpenEnum és WNetCloseEnum. A következőkben feltárjuk a metódusok deklarációit.
WNetOpenEnum metódus
WNetOpenEnum
int WNetOpenEnum(
RESOURCE_SCOPE dwScope, RESOURCE_TYPE dwType, RESOURCE_USAGE dwUsage, object lpNetResource, out IntPtr lphEnum
);
A metódus segítségével elkezdhetjük kigyűjteni a hálózat erőforrásait, megosztott mappáinak nevét.
Paraméterek
RESOURCE_SCOPE dwScope
Egy konstans segítségével megadhatjuk a lekérdezési területet, vagyis hogy a hálózat mely részeit kell figyelembe venni a lekérdezéskor (minden erőforrást, vagy csak egy részét kell kigyűjteni). A konstansokat a Win32 osztályban deklaráltuk egy felsorolt típus részeként:
public enum RESOURCE_SCOPE
{
  RESOURCE_CONNECTED = 0x00000001,
Csak az aktuálisan csatlakoztatott erőforrásokat gyűjti ki.
  RESOURCE_CONTEXT= 0x00000005,
Az összes, a hívó kontextusában található erőforrást kigyűjti.
  RESOURCE_GLOBALNET = 0x00000002,
Az összes hálózati erőforrást kigyűjt, függetlenül attól, hogy elérhető vagy sem.
}
RESOURCE_TYPEdwType
Megadható, hogy milyen típusú erőforrásokat listázzon ki a metódus. Ezek a következők lehetnek:
RESOURCETYPE_ANY= 0x00000000,
Minden erőforrás.
RESOURCETYPE_DISK= 0x00000001,
Minden meghajtó erőforrás.
RESOURCETYPE_PRINT = 0x00000002,
Minden nyomtató erőforrás.
RESOURCE_USAGEdwUsage
Az erőforrások csoportja specifikálható ezzel a paraméterrel is. Nulla érték esetén az összes erőforrást figyelembe veszi. Egyébként a következő konstansokat használhatjuk:
RESOURCEUSAGE_CONNECTABLE =0x00000001,
Csatlakoztatható erőforrások.
RESOURCEUSAGE_CONTAINER=0x00000002,
Minden konténer erőforrás.
RESOURCEUSAGE_ATTACHED=0x00000010,
Minden authentikációt igénylő erőforrás. Ebben az esetben a metódus hibát okoz, ha a metódust lefuttató felhasználónak nincs joga ezekhez az erőforrásokhoz.
Ha az első paraméter értéke nem RESOURCE_GLOBALNET, akkor a paraméter figyelmen kívül marad.
object lpNetResource
Egy NETRESOURCE típusú struktúrában kell megadni, hogy mely erőforrás- konténerbe tartozó erőforrásokat kell kigyűjteni. Amennyiben az első paraméter értéke nem azonos a RESOURCE_GLOBALNET konstanssal, akkor értéke NULL kell legyen. Amennyiben az értéke NULL, akkor kigyűjtés a gyökérelemtől kezdődően indul. A gyökér a legtágabb értelmű konténer a hálózatban.
out IntPtr lphEnum
Egy mutató, mely a WNetEnumResource metódus első paramétere lesz. Ez azt jelenti, hogy a kigyűjtés műveletet mindig ezzel a metódushívással kell kezdeni.
Visszatérési érték
Sikeres műveletvégzés esetén a visszatérési érték nulla.
WNetEnumResource metódus
WNetEnumResource
int WNetEnumResource(
IntPtr hEnum, refint lpcCount, IntPtr lpBuffer, ref int lpBufferSize
);
Az erőforrások kigyűjtésének oroszlánrészét végző metódus, mely folytatja a WNetOpenEnum metódus által elkezdett műveletet.
Paraméterek
IntPtr hEnum
A WNetOpenEnum metódus által lekérdezett mutató.
ref int lpcCount
A paraméterrel megadható, hogy hány bejegyzés lekérdezése várható. Amennyiben a paraméter értéke -1, akkor a metódushívás után a paraméter értéke a lekérdezett erőforrások száma lesz.
IntPtr lpBuffer
Egy mutató, mely a lekérdezés után a kigyűjtött erőforrások adatait tartalmazó memóriaterületre mutat. Az információkat egy-egy NETRESOURCE típusú struktúra tartalmazza.
ref int lpBufferSize
Megadható, hogy mekkora méretű (bájtban) memóriaterület foglalására van szükség az adatok lekérdezéséhez. Amennyiben a megadott méret túl kicsi, akkor a változó a szükséges terület méretét tartalmazza.
Visszatérési érték
Ennek a metódusnak is nulla a visszatérési érték sikeres művelet végrehajtás esetén.
WNetCloseEnum metódus
WNetCloseEnum
int WNetCloseEnum(
IntPtr hEnum
)
A metódus hívása szükséges a lekérdezési művelet befejezéséhez, melyet a WNetOpenEnum metódussal indítottunk el.
Paraméterek
IntPtr hEnum
A paraméter egy mutató, melyet a WNetCloseEnum metódus hívásával kaptunk.
Visszatérési érték
Nulla, amennyiben a hívás nem okozott hibát.
A metódusok hívásával tehát szelektálható, hogy mely típusba tartozó erőforrás legyen kigyűjtve. A mellékelt példában nem szűkítettük a kört, az összes lehetséges erőforrás lekérdezését specifikáltuk a metódusok hívásakor.
Amikor a példa-alkalmazásban a nyomógombra kattintunk, akkor a következő lépések történnek a Process metódusban. Elsőként a WNetOpenEnum metódust hívjuk meg úgy, hogy a hálózat egészét pásztázza, és valamennyi erőforrást vegyen figyelembe.
iRet = Win32.WNetOpenEnum(Win32.RESOURCE_SCOPE.RESOURCE_GLOBALNET,Win32.RESOURCE_TYPE.RESOURCETYPE_ANY,Win32.RESOURCE_USAGE.RESOURCEUSAGE_ALL,o,out ptrHandle);
Amennyiben a visszatérési érték nulla, akkor folytatható a lekérdezés. A következő lépés, hogy memóriaterületet foglalunk a lekérdezett információnak.
int buffer = 16384;
IntPtr ptrBuffer = Marshal.AllocHGlobal(buffer);
Elindítunk egy ciklust, melyben az összes hálózati erőforrást megvizsgáljuk.
for(;;)
{
  entries = -1;
Meghívjuk a WNetEnumResource metódust.
  iRet = Win32.WNetEnumResource(ptrHandle, ref entries, ptrBuffer, ref buffer);
Ha a visszatérési érték nulla, akkor megvizsgáljuk a függvény második paraméterét, hogy hány darab erőforrást talált a metódus. Ezeket egy ciklussal térképezzük fel.
  Int32 ptr = ptrBuffer.ToInt32();
  for(int i = 0;i<entries;i++)
  {
A metódus hívása után a NETRESOURCE típusú struktúra tartalmazza az erőforrások adatait.
    nr = (Win32.NETRESOURCE)Marshal.PtrToStructure( new IntPtr(ptr), typeof(Win32.NETRESOURCE) );
Amennyiben a struktúra harmadik mezőjének értéke a RESOURCEUSAGE_CONTAINER konstanssal azonos, akkor a struktúrát átadva paraméterként újra meghívjuk a Process metódust.
    if (Win32.RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER == nr.dwUsage & in32.RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER))
    {
      Process(nr);
    }
A művelet végén egy ListViewItem objektumot hozunk létre az adatokkal, és a ListView kontrol egy új sorában helyezzük el azokat.
    ptr += Marshal.SizeOf(nr);
    string[] data = new string[2];
    data[0] = nr.dwDisplayType.ToString();
    data[1] = nr.lpRemoteName; 
    ListViewItem lvi = new ListViewItem(data);            
    listView1.Items.Add(lvi);
  }
}
Ezt követően felszabadítjuk a memóriaterületet, majd meghívjuk a folyamat lezárását végző WNetCloseEnum metódust.
Marshal.FreeHGlobal(ptrBuffer);
iRet = Win32.WNetCloseEnum(ptrHandle);

Hálózati meghajtó-műveletek metódusai cikksorozat

Hálózati erőforrások lekérdezése - Hálózati meghajtó-műveletek metódusai 2. rész