|
|
|

| | | | | | | | |  |
 | 
 | Code source : unité LRJ_WinNetUsers |  |

|  |
 | |  |

|
Description : cette unité contient les objets suivants :
. LRJ_TUsersAccountList_QueryDisplayInfo extrait la liste des utilisateurs d'un serveur.
. LRJ_TUsersAccountList_NetUserEnum extrait la liste des utilisateurs et des informations
associées d'un serveur.
. LRJ_TUsersGroupList extrait la liste des groupes globaux d'un utilisateur.
. LRJ_TUsersLocalGroupList extrait la liste des groupes locaux d'un utilisateur.
. LRJ_TUsersGetInfo extrait les informations disponibles sur un utilisateur.
. LRJ_TUsersGetModals extrait les informations disponibles concernant le domaine d'appartenance
sur un utilisateur.
. LRJ_TUsersSetModals modifie les informations d'un serveur sur les utilisateurs.
. LRJ_TUsersGroupsEntries sert à entrer les informations sur un groupe global pour intégrer un
utilisateur à ce groupe par l'intermédiaire de l'objet LRJ_TUsersSetGroups.
LRJ_TUsersSetGroups intégre un utilisateur à une liste de groupes globaux.
LRJ_TUsersSetInfo modifie les informations d'un utilisateur.
L'unité est livrée avec une application de démonstration (
voir description plus loin
) qui
utilise toutes les fonctionnalités de la NetUser API. Les codes de l'application
sont livrés avec l'unité pour illustrer comment utiliser les objets de
cette unité. L'application de démonstration utilise les unités
LRJ_WindowsPlus,
LRJ_GridsPlus,
LRJ_WinSID,
LRJ_WinNetApi et LRJ_WinNetGroups
non livrées avec l'application.
L'unité LRJ_WinNetUsers met en
oeuvre les fonctions de Windows suivantes :
|
|
NetQueryDisplayInformation
NetUserAdd
NetUserChangePassword
NetUserDel
NetUserEnum
NetUserGetGroups
NetUserGetInfo
NetUserGetLocalGroups
NetUserModalsGet
NetUserModalsSet
NetUserSetGroups
NetUserSetInfo
|
Déclarations publiques de l'unité
I
Télécharger l'application de démonstration
I
Exemples d'utilisations
Utilise les unités : Windows, Classes, SysUtils,
LRJ_WinNetApi,
LRJ_ClassesPlus et
LRJ_WinSID.
Version : 1.5 du 16.05.2009
Auteur : Laurent Hède
Copyright : LorenJo
Nombre de lignes : 2057
Réalisée sous : Delphi 6
Systèmes compatibles : NT4, 2000, XP, Vista, serveurs
Prix : 466.00 € H.T.
Déclarations publiques de l'unité :
unit LRJ_WinNetUsers;
interface
uses
Windows,
Classes,
SysUtils,
LRJ_WinNetApi,
LRJ_ClassesPlus,
LRJ_WinSID;
type
// Object de base pour les objets de la Net USER API nécessitant le nom de l'utilisateur
//------------OBJET----------------------------
LRJ_TNetUsersAPIBase = class(LRJ_TNetAPIBase)
.......
property UserName: string read MOUserName write MOUserName;
end;//-----------FIN--------------------------
.......
// Basé sur NetQueryDisplayInformation, sensé être préférable à netUserEnum
// Extrait la liste des utilisateurs sur une machine locale ou sur un serveur
//------------OBJET----------------------------
LRJ_TUsersAccountList_QueryDisplayInfo = class(LRJ_TNetAPIBase)
.......
function Load: NET_API_STATUS; // Charge la liste
function Count: integer; // nombre d'utilisateurs chargés
function IndexOf(const AUserName: string): integer; overload;
function IndexOf(const AUserID: DWORD): integer; overload;
function GetUsersAccount(const AIndex: integer): PTUserAccountInfo;
end;//-----------FIN--------------------------
.......
// Basé sur NetUserEnum
// Extrait la liste des utilisateurs et des informations associés sur une machine locale ou sur un serveur
// L'extraction des USER_INFO_23 ne fonctionne pas sous XP, ERROR_INVALID_LEVEL
//------------OBJET----------------------------
LRJ_TUsersAccountList_NetUserEnum = class(LRJ_TNetAPIBase)
.......
function Load: NET_API_STATUS; // Charge la liste
function Count: integer; // nombre d'utilisateurs chargés
function GetUsersAccount(const AIndex: integer): pointer; // Selon le Level, revoie un des pointeurs ci-dessus
function IndexOf(const AName: string): integer;
property Level: DWORD read MOLevel write MOLevel;
property Filter: DWORD read MOFilter write MOFilter;
end;//-----------FIN--------------------------
.......
// extrait la liste des groups globaux d'un utilisateur
//------------OBJET----------------------------
LRJ_TUsersGroupList = class(LRJ_TNetUsersAPIBase)
.......
function Load: NET_API_STATUS; // Charge la liste
function Count: integer; // nombre de groupes chargés
function IndexOf(const AGroupName: string): integer;
function GetUsersGroup(const AIndex: integer): LRJ_PGROUP_USERS_INFO_1;
end;//-----------FIN--------------------------
.......
// extrait la liste des groups locaux d'un utilisateur
//------------OBJET----------------------------
LRJ_TUsersLocalGroupList = class(LRJ_TNetUsersAPIBase)
.......
function Load: NET_API_STATUS; // Charge la liste
function Count: integer; // nombre de groupes chargés
function IndexOf(const AGroupName: string): integer;
function GetUsersLocalGroup(const AIndex: integer): LRJ_POCALGROUP_USERS_INFO_0;
property Flag: DWORD read MOFlag write MOFlag;
end;//-----------FIN--------------------------
// Extrait les infos disponible d'un utilisateur
//------------OBJET----------------------------
LRJ_TUsersGetInfo = class(LRJ_TNetUsersAPIBase)
.......
function Load: NET_API_STATUS; // Extrait les infos
function LirePointeurInfo: pointer; // de LRJ_PUSER_INFO_0 à LRJ_PUSER_INFO_23 selon level
property Level: DWORD read MOLevel write MOLevel;
end;//-----------FIN--------------------------
.......
//extrait les infos disponibles concernant le domaine d'appartenance sur un utilisateur
//------------OBJET----------------------------
LRJ_TUsersGetModals = class(LRJ_TNetAPIBase)
.......
function Load: NET_API_STATUS; // Extrait les infos
function LirePointeurInfo: pointer; // de LRJ_PUSER_MODALS_INFO_0 à LRJ_PUSER_MODALS_INFO_3 selon level
property Level: LRJ_TUsersGetModalsLevel read MOLevel write MOLevel;
end;//-----------FIN--------------------------
//modifie les infos d'un serveur sur les utilisateurs
//------------OBJET----------------------------
LRJ_TUsersSetModals = class(LRJ_TNetAPIBase)
public//-----------PUBLIC--------------------------
function SetMinPasswdLen(const AMinLen: DWORD): NET_API_STATUS;
function SetMaxPasswdAge(const AMaxAge: DWORD): NET_API_STATUS;
function SetMinPasswdAge(const AMinAge: DWORD): NET_API_STATUS;
function SetTimeForceLogoff(const ATimeSec: DWORD): NET_API_STATUS;
function SetPasswordHistLen(const ALength: DWORD): NET_API_STATUS;
function SetRole(const ARole: DWORD): NET_API_STATUS;
function SetPrimaryDomainControllerName(const ANewName: string): NET_API_STATUS;
function SetUSER_MODALS_INFO_0(const AMinPasswdLen, AMaxPasswdAge, AMinPasswdAge, ATimeForceLogoff,
APasswordHistLen: DWORD): NET_API_STATUS;
function SetUSER_MODALS_INFO_1(const ARole: DWORD; const ANewDomainControllerName : string): NET_API_STATUS;
function SetUSER_MODALS_INFO_2(const ADomainName, AStringSID : string): NET_API_STATUS;
function SetUSER_MODALS_INFO_3(const ALockoutDuration , ALockoutObservationWindow, ALockoutThreshold : DWORD): NET_API_STATUS;
end;//-----------FIN--------------------------
// pour charger un ou des groupes globaux auxquels l'utilisateur deviendra membre avec l'objet LRJ_TUsersSetGroups
//------------OBJET----------------------------
LRJ_TUsersGroupsEntries = class(LRJ_TList)
.......
procedure AddGroupName(const AGroupName: string);
procedure AddGroupNameList(const AGroupNameList: TStrings);
procedure AddGroupNameAndAttributes(const AGroupName: string; AAttribute: DWORD);
end;//-----------FIN--------------------------
// pour rendre un utilisateur membre de groupes globaux (chargés avec l'objet LRJ_TUsersGroupsEntries)
//------------OBJET----------------------------
LRJ_TUsersSetGroups = class(LRJ_TNetUsersAPIBase)
public//-----------PUBLIC--------------------------
function SetNewGroups(const AGroupsNameList: LRJ_TUsersGroupsEntries): NET_API_STATUS;
function SetNewGroupsAndAttrib(const AGroupsNameList: LRJ_TUsersGroupsEntries): NET_API_STATUS;
end;//-----------FIN--------------------------
//modifie les informations concernant un utilisateur
//------------OBJET----------------------------
LRJ_TUsersSetInfo = class(LRJ_TNetUsersAPIBase)
public//-----------PUBLIC--------------------------
//functions pour modifier des paramètres un par un
function SetNewName(const ANewName: string): NET_API_STATUS;
function SetNewPassword(const ANewPassword: string): NET_API_STATUS;
function SetNewPrivilege(const ANewPrivilege: DWORD): NET_API_STATUS;
function SetNewHomeDir(const ANewHomeDir: string): NET_API_STATUS;
function SetNewComment(const ANewComment: string): NET_API_STATUS;
function SetNewFlag(const ANewFlag: DWORD): NET_API_STATUS;
function SetNewScriptPath(const ANewScriptPath: string): NET_API_STATUS;
function SetNewAuthFlag(const ANewAuthFlag: DWORD): NET_API_STATUS;
function SetNewFullName(const ANewFullName: string): NET_API_STATUS;
function SetNewUsrComment(const ANewUsrComment: string): NET_API_STATUS;
function SetNewWorkstations(const ANewWorkstations: string): NET_API_STATUS;
function SetNewAcctExpires(const ANewAcctExpires: DWORD): NET_API_STATUS;
function SetNewCountryCode(const ANewCountryCode: DWORD): NET_API_STATUS;
function SetNewPrimaryGroupID(const ANewPrimaryGroupID: DWORD): NET_API_STATUS;
function SetNewProfile(const ANewProfile: string): NET_API_STATUS;
function SetNewHomeDirDrive(const ANewHomeDirDrive: string): NET_API_STATUS;
function SetUSER_INFO_1020(const AUnitsPerWeek : DWORD; ALogonHours : string): NET_API_STATUS;
function SetEncryptedPassword(const AEncryptedPassword : LRJ_TNetUserEncryptedPassword): NET_API_STATUS;
// Attention, pour les function en dessous, il faut renseigner toutes ces valeurs et toutes ces valeurs
// vont être changées d'un seul coup. Si on souhaite ne pas modifier une des valeurs, il faut
// renseigner la valeur initiale ou utiliser les fonctions ci-dessus pour modifier les valeurs une par une
function SetUSER_INFO_1(const ANewPassword: string;
const ANewPrivilege: DWORD;
const ANewHomeDir: string;
const ANewComment: string;
const ANewFlag: DWORD;
const ANewScriptPath: string
): NET_API_STATUS;
function SetUSER_INFO_2(const ANewPassword: string;
const ANewPrivilege: DWORD;
const ANewHomeDir: string;
const ANewComment: string;
const ANewFlag: DWORD;
const ANewScriptPath: string;
const ANewAuthFlag: DWORD;
const ANewFullName: string;
const ANewUsrComment: string;
const ANewWorkstations: string;
const ANewAcctExpires: DWORD;
const ANewMaxStorage: DWORD;
const ANewUnitsPerWeek : DWORD;
const ANewLogonHours : string;
const ANewCountryCode: DWORD;
const ANewCodePage: DWORD
): NET_API_STATUS;
function SetUSER_INFO_3(const ANewPassword: string;
const ANewPrivilege: DWORD;
const ANewHomeDir: string;
const ANewComment: string;
const ANewFlag: DWORD;
const ANewScriptPath: string;
const ANewAuthFlag: DWORD;
const ANewFullName: string;
const ANewUsrComment: string;
const ANewWorkstations: string;
const ANewAcctExpires: DWORD;
const ANewMaxStorage: DWORD;
const ANewUnitsPerWeek : DWORD;
const ANewLogonHours : string;
const ANewCountryCode: DWORD;
const ANewCodePage: DWORD;
const ANewProfile: string;
const ANewHomeDirDrive: string;
const ANewPasswordExpired: DWORD
): NET_API_STATUS;
function SetUSER_INFO_4(const ANewPassword: string;
const ANewPrivilege: DWORD;
const ANewHomeDir: string;
const ANewComment: string;
const ANewFlag: DWORD;
const ANewScriptPath: string;
const ANewAuthFlag: DWORD;
const ANewFullName: string;
const ANewUsrComment: string;
const ANewWorkstations: string;
const ANewAcctExpires: DWORD;
const ANewMaxStorage: DWORD;
const ANewUnitsPerWeek : DWORD;
const ANewLogonHours : string;
const ANewCountryCode: DWORD;
const ANewCodePage: DWORD;
const ANewProfile: string;
const ANewHomeDirDrive: string;
const ANewPasswordExpired: DWORD
): NET_API_STATUS;
function SetUSER_INFO_22(const ANewEncryptedPassword: LRJ_TNetUserEncryptedPassword;
const ANewPrivilege: DWORD;
const ANewHomeDir: string;
const ANewComment: string;
const ANewFlag: DWORD;
const ANewScriptPath: string;
const ANewAuthFlag: DWORD;
const ANewFullName: string;
const ANewUsrComment: string;
const ANewWorkstations: string;
const ANewAcctExpires: DWORD;
const ANewMaxStorage: DWORD;
const ANewUnitsPerWeek : DWORD;
const ANewLogonHours : string;
const ANewCountryCode: DWORD;
const ANewCodePage: DWORD
): NET_API_STATUS;
end;//-----------FIN--------------------------
function LRJ_TNetUserAPI_StringToNonNilOleStr(AString: string): PWideChar;
|
Application de démonstration

Pour tous les onglets, les informations extraites ou manipulées le sont sur le serveur indiqué
par le champ "Serveur Name" situé à l'extrême haut de la fenêtre ouverte. Si ce champ est vide,
le travail est réalisé sur le serveur local de la machine sur laquelle cette application est
exécutée.
L'onglet "QueryDisplay" permet de charger la liste des utilisateurs. Il faut cliquer sur "Charge
list". L'onglet "QueryDisplay" illustre l'utilisation de la fonction NetQueryDisplayInformation.
L'onglet "Enum" permet de charger la liste des utilisateurs et des informations associées en
fonction d'un niveau d'énumération et d'un filtre. Choisir le niveau d'énumération par le comboBox
"Level" et le filtre par le comboBox "Filter" puis charger la liste en cliquant sur "Charge List".
L'onglet "Enum" illustre l'utilisation de
la fonction NetUserEnum de la NetUser API.
L'onglet "Add" permet de créer un nouvel utilisateur. Il faut renseigner les informations sur
l'utilisateur dans la grille en fonction de plusieurs degrés d'information représentés par le
comboBox "Type infos" puis cliquer sur "Créer utilisateur". Cet onglet illustre l'utilisation de la
fonction NetUserAdd de la NetUser API.
L'onglet "Del" permet de supprimer un utilisateur. Il faut charger la liste des utilisateurs en
cliquant sur "Rafraîchir liste" puis sélectionner un utilisateur en cliquant sur sa ligne dans
la liste puis cliquer sur "Select utilisateur" pour valider la sélection d'un utilisateur puis
cliquer sur "Delete" pour le détruire. L'onglet "Del" illustre l'utilisation de la fonction
NetUserDel de la NetUser API.
L'onglet "ChangePassword" permet de modifier le mot de passe d'un utilisateur. Il faut charger
la liste des utilisateurs en cliquant sur "Charger liste" puis sélectionner un utilisateur en
cliquant sur sa ligne dans la liste puis en cliquant sur "Select utilisateur", puis saisir
l'ancien mot de passe dans le champ "Ancien password", puis saisir le nouveau mot de passe
dans le champ "Nouveau password" puis cliquer sur "Modifier mot de passe". L'onglet "ChangePassword"
illustre l'utilisation de la fonction NetUserChangePassword de la NetUser API.
L'onglet "GetGroups" permet de changer la liste des groupes globaux dont un utilisateur est
le membre. Il faut charger la liste des utilisateurs en cliquant sur "Charge liste user" puis
sélectionner un utilisateur en cliquant sur sa ligne dans la liste, puis cliquer sur "Charge liste
group". Les groupes sont chargés en même temps que des informations sur le groupe selon
le type d'information choisi dans le comboBox "Type info". L'onglet "GetGroups" illustre
l'utilisation de la fonction NetUserGetGroups de la NetUser API.
L'onglet "GetLocalGroups" permet de charger la liste des groupes locaux dont un utilisateur est
le membre. Il faut charger la liste des utilisateurs en cliquant sur "Charge list user" puis
sélectionner un utilisateur en cliquant sa ligne dans la liste puis charger la liste des
groupes en cliquant sur "Charge list group". L'onglet "GetLocalGroups" illustre l'utilisation
de la fonction NetUserGetLocalGroups de la NetUser API.
L'onglet "GetInfo" permet de charger la liste des informations disponibles concernant un
utilisateur en fonction d'un niveau d'information. Il faut charger la liste des utilisateurs en
cliquant sur "Charge liste" puis sélectionner un utilisateur en cliquant sur sa ligne dans la
liste puis cliquer sur "Charge info" pour charger les informations en fonction du niveau
d'information défini par le comboBox "Level". Si on souhaite charger un autre niveau d'information,
modifier le niveau par le comboBox "Level" puis recharger la liste en cliquant sur "Charge info".
L'onglet "GetInfo" illustre l'utilisation de la fonction NetUserGetInfo de la NetUser API.
L'onglet "ModalsGet" permet de charger des informations sur la base de donnée de sécurité
du serveur en cours d'utilisation (champ "Serveur Name"). Il faut cliquer sur "Charge Info"
pour charger les informations en fonction du niveau d'information défini par le comboBox "Level"
et re-cliquer sur "Charge Info" lorsqu'on modifie le comboBox "Level". L'onglet "ModalsGet"
illustre l'utilisation de la fonction NetUserModalsGet de la NetUser API.
L'onglet "ModalsSet" permet de modifier des données générales sur les utilisateurs contenues
dans la base de donnée de sécurité du serveur en cours d'utilisation (champ "Serveur Name"). Il
faut renseigner les données à entrer dans la base de donnée dans la grille puis cliquer sur
"Set new info". Le niveau d'information des données à insérer est défini par le comboBox "Level".
L'onglet "ModalsSet" illustre l'utilisation de la fonction NetUserModalsSet de la NetUser API.
L'onglet "SetGroups" permet de rendre un utilisateur membre de groupes globaux. Il faut charger la
liste des utilisateurs en cliquant sur "Charge list" puis sélectionner un utilisateur en cliquant
sur la ligne de l'utilisateur dans la liste puis en cliquant sur "Select user select". Ensuite,
il faut déterminer les groupes globaux dont on va rendre l'utilisateur membre. Pour cela, charger
la liste des groupes globaux en cliquant sur "Charge list" situé au-dessus de la liste des
groupes, puis insérer un groupe dans la liste des groupes sélectionnés en cliquant sur le groupe
dans la liste "Liste groups" puis en cliquant sur ">>" ou retirer un groupe des groupes sélectionnés
en cliquant sur le groupe dans la liste "List group set" puis en cliquant sur "<<". Lorsque la
liste est constituée, cliquer sur "Set list Groups par SetGroup" pour rendre membre de ces groupes
l'utilisateur sélectionné. Cette opération n'est possible que si l'utilisateur qui utilise
cette application à les droits suffisants. L'onglet "SetGroups" illustre l'utilisation de la fonction
NetUserSetGroups de la NetUser API.
L'onglet "SetInfo" permet de modifier des données sur un utilisateur. Il faut d'abord charger la liste
des utilisateurs en cliquant sur "Charge list" puis sélectionner un utilisateur en cliquant sur
son nom dans la liste puis en cliquant sur "Select user select" puis saisir les informations
dans la grille puis cliquer sur "SetInfo" pour modifier les informations concernant l'utilisateur
par celles présentes dans la grille. Attention, le champ xxx_password ne peut pas être pré-chargé avec
les informations actuelles et il faut donc ressaisir le mot de passe actuel pour qu'il subsiste,
sinon il sera remplacé par la valeur du champ ("non pré-chargeable" en standard). On modifie
une liste d'information par une seule opération. Cette liste est définie par la valeur du comboBox
"Level". Pour des valeurs de "Level" supérieur à 1000, il n'y a qu'une seule information qui est
modifiée à la fois par cette opération. L'onglet "SetInfo" illustre l'utilisation de la fonction NetUserSetInfo
de la NetUser API.
Exemples d'utilisations
Charger la liste des utilisateurs d'une machine locale dans ListBox1
var
zListGroup: LRJ_TUsersAccountList_QueryDisplayInfo;
i: integer;
zPter: PTUserAccountInfo;
begin
ListBox1.Items.Clear;
zListGroup := LRJ_TUsersAccountList_QueryDisplayInfo.Create;
if zListGroup.Load = 0 then
begin
for i:=0 to zListGroup.Count-1 do
begin
zPter := zListGroup.GetUsersAccount(i);
ListBox1.Items.Add( zPter.name);
end;
end
else
;//problème
zListGroup.Free;
end;
|
Rendre l'utilisateur dont le nom se situe dans edit7 et qui appartient au serveur dont le nom
se situe dans edit6 membre des groupes globaux listés dans ListBox9
var
zSetGroup : LRJ_TUsersSetGroups;
zListGroupSet: LRJ_TUsersGroupsEntries;
zResult: NET_API_STATUS;
begin
zSetGroup := LRJ_TUsersSetGroups.Create;
zSetGroup.ServeurName := edit6.Text;
zSetGroup.UserName := edit7.Text;
zListGroupSet := LRJ_TUsersGroupsEntries.Create;
zListGroupSet.AddGroupNameList(ListBox9.Items);
if zSetGroup.SetNewGroups(zListGroupSet) <> 0 then
begin
// problème
end;
zListGroupSet.Free;
zSetGroup.Free;
end;
|
Vous n'avez pas trouvé d'exemple répondant à votre problématique ?
Cliquez sur ce lien.
|
|  |
 | |  |
|
|