A példaprogramunkban egy ComboBox-ban jelenítjük meg a számítógép felhasználóinak listáját, és egy szövegmezőben a felhasználó típusát, mely háromféle lehet: vendég (0), általános felhasználó (1) és adminisztrátor (2).
A felhasználók közül a kiválasztott törölhető a FELHASZNÁLÓ TÖRLÉSE feliratú gombbal. Az ÚJ FELHASZNÁLÓ feliratúval pedig egy új felhasználó vehető fel a listába. Utóbbi művelet esetén egy űrlap jelenik meg, melyen megadható a felhasználó jelszava és egy megjegyzés is. A felhasználónév megadása kötelező.
Az API függvények elérésének egyszerűsítése végett ezek meghívása saját metódusokon keresztül történik, melyeket a NetworkClass osztályban deklaráltunk.
A nem-menedzselt metódusok két nem-menedzselt struktúrát használnak, melyekhez létrehoztuk a menedzselt megfelelőket. Az első a USER_UNIT_0, mely a felhasználónevek kigyűjtését teszi lehetővé.
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct USER_INFO_0
{
public String Username;
}
A USER_UNIT_1 struktúra segítségével kérdezzük le a felhasználói információkat, melyek közül a felhasználótípust jelenítjük meg a Form-on. A struktúrát feltöltjük adatokkal új felhasználó hozzáadásakor.
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct USER_INFO_1
{
public string usri1_name;
public string usri1_password;
public int usri1_priv;
public string comment;
...
}
A felhasználók neveit a NetUserEnum függvénnyel kérdezhetjük le.
[DllImport("Netapi32.dll")]
public extern static int NetUserEnum(string servername, int level, int filter, out IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries, out int resume_handle);
A NetworkClass osztályban a GetUserNames metódusba ágyaztuk a függvény meghívását.
A felhasználói adatokat a NetUserGetInfo függvénnyel kérdezzük le, meghívását a GetUserData metódusba ágyazva.
[DllImport("Netapi32.dll")]
public extern static int NetUserGetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername,[MarshalAs(UnmanagedType.LPWStr)] string username,int level,out IntPtr bufptr);
Amennyiben felhasználót kívánunk törölni, akkor a műveletet a NetUserDel függvény végzi el.
[DllImport("Netapi32.dll")]
public extern static int NetUserDel([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string username);
A metódus, melyben meghívjuk a függvényt, a következőképpen fest:
public bool DeleteUser(string user)
{
bool result = false;
if (NetUserDel(null,user) == 0)
{
result = true;
}
return result;
}
Látható, hogy a első paraméterében kell megadnunk a számítógép nevét, melyen a felhasználó található. Jelen példában ez NULL, hiszen a PC-nk felhasználójáról van szó. A második paraméterben adjuk meg a felhasználó nevét. A függvény nullával tér vissza sikeres műveletvégzés esetén.
Új felhasználó felvételekor a NetUserAdd függvényt hívjuk meg. A függvény első paraméterben adjuk meg a számítógép nevét, melyen a felhasználói fiókot létre kívánjuk hozni. Jelen esetben NULL. Harmadik paramétere tartalmaz egy referenciát a felhasználói információkat tartalmazó struktúrára. A függvényhívás a NewUser metódusban történik meg, ahol a művelet a struktúra egy példányának létrehozásával indul.
public bool NewUser(string name, string password, string comment)
{
bool result = false;
USER_INFO_1 user = new USER_INFO_1();
A struktúra megfelelő mezőit feltöltjük a kapott paraméterekkel.
user.usri1_name = name;
user.usri1_password = password;
user.comment = comment;
user.usri1_priv = 1;
És a függvényhívás. A függvényhívás nullát ad eredményül, ha a művelet sikeres volt.
if (NetUserAdd(null, 1, ref user, 0) == 0)
{
result = true;
}
...
}