Code source
Code source

  Présentation
  Unités exemple gratuites
  Unités commercialisées
  Conditions d'utilisation
  Comment acheter
  Vendez vos codes
Unités commercialisées

  LRJ_DosDevice
  LRJ_FileMapped
  LRJ_ModifDateTime
  LRJ_ShellUtils
  LRJ_TokenAPI
  LRJ_WinACL
  LRJ_WinBrowseDialog
  LRJ_WinCreateProcess
  LRJ_WinDesktop
  LRJ_WinDirectories
  LRJ_WinDocRecents
  LRJ_WinDrives
  LRJ_WinFavorisWeb
  LRJ_WinFiles
  LRJ_WinIconNotifArea
  LRJ_WinInternetShortcut
  LRJ_WinMenuFolder
  LRJ_WinModule
  LRJ_WinNetApi
  LRJ_WinNetLocalGroups
  LRJ_WinNetUsers
  LRJ_WinPrivileges
  LRJ_WinProcess
  LRJ_WinRecycleBin
  LRJ_WinRegion
  LRJ_WinRegAppPath
  LRJ_WinShellLink
  LRJ_WinShellUI
  LRJ_WinSID
  LRJ_WinStation
  LRJ_WinTokenGroups
  LRJ_WinTrackChangeDir
  LRJ_WinVolumes
  LRJ_WinWorkingSet

   Accueil | GlobalDesk | Code source Delphi | Développements | Votre compte | Contact   

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.


 Accueil | GlobalDesk | Code source Delphi | Développements | Votre compte | Contact 
Copyright © LorenJo 2000-2009    Notice légale