Bonjour,
J'aimerais savoir vers quelles fonctions m'orienter pour récupérer l'adresse IP de la machine, le nom d'utilisateur ainsi que le nom de domaine pour une session donnée.
Merci d'avance
Bonjour,
J'aimerais savoir vers quelles fonctions m'orienter pour récupérer l'adresse IP de la machine, le nom d'utilisateur ainsi que le nom de domaine pour une session donnée.
Merci d'avance
Quel type de session ? TSE ? Accès à un partage ? Ouverture sur AD ?
Dans le premier et le dernier cas, utilise une fonction dans ton logon script qui trace les utilisateurs qui se connectent.
Je ne connais pas le terme technique, mais je parle de la session windows, au démarrage de l'ordinateur. Les identifiants avec lesquels je me connecte sur l'active directory.
Ok, donc à chaque ouverture de session dite interactive, on peut exécuter un script d'ouverture de session. Ce script s'exécute localement sur la machine sur laquelle tu ouvres la session.
Donc dans ce script (le créer s'il n'existe pas), ajoute une fonction pour récupérer les données que tu veux.
Si tu n'es pas l'admin AD, vois avec celui qui s'en occupe.
En fait, j'aimerais récupérer les données pour les intégrer dans un programme C++, et ensuite, après traitement, enregistrer les données dans une base de données.
Il n'y a des fonctions de l'API Windows permettant de récupérer ces infos?
Sans aller jusque là, un ipconfig et lecture des variables d'environnement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 USERDNSDOMAIN USERDOMAIN USERNAME
Merci pour ces variables d'environnement, ça sera une manière de faire si je ne trouve pas à quelles fonctions de l'API elles correspondent
Tu as tout dans la librairie MSDN, mais pour ce que tu veux faire, je trouve que tu vas prendre un rouleau compresseur pour écraser une mouche...
Mais libre à toi
Pour ta première question : Comment récupérer l'adresse d'une machine dont on connaît le nom ?.
Pour le nom de l''utilisateur actuellement connecté, Windows est un système multi-utilisateur c'est-à-dire qui permet à plusieurs utilisateurs de travailler simultanément sur une même machine. Il peut donc y avoir plus d'un utilisateur connecté. Pour connaître le nombre d'utilisateurs actuellement connectés, utilise la fonction NetWkstaGetInfo avec comme paramètre level = 102. Appelle ensuite la fonction NetWkstaUserEnum pour avoir des informations (incluant le nom ...) sur ces différents utilisateurs.
NetWkstaGetInfo permet également de connaître le domaine auquel appartient la machine. Lis bien la doc.
Inutile de te faire remarquer que la méthode prescrite par Kuzco est, dans la plupart du cas, celle qui est à préférer en raison de sa simplicité. Utilise la fonction ExpandEnvironmentStrings (Win32) ou tout simplement getenv (ANSI C).
Au cas où :
Comment créer un logon script ?
Merci pour vos réponses.
Je me mets au travail ^^
J'ai testé la fonction que Melem m'a proposé.
Voici l'erreur qui est générée:
D'après MSDN, il faut inclure lmwksta.h et netapi32.lib (section link de visual studio?) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 c:\program files\microsoft visual studio\vc98\include\lmwksta.h(41) : error C2146: syntax error : missing ';' before identifier 'NET_API_FUNCTION' c:\program files\microsoft visual studio\vc98\include\lmwksta.h(41) : error C2501: 'NET_API_STATUS' : missing storage-class or type specifiers c:\program files\microsoft visual studio\vc98\include\lmwksta.h(41) : fatal error C1004: unexpected end of file found
Ca dit aussi que c'est supporté seulement par Windows NT. J'ai Windows XP. Ca correspond à Windows ou Windows NT?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 QuickInfo Windows NT: Requires version 3.1 or later. Windows: Unsupported. Windows CE: Unsupported. Header: Declared in lmwksta.h. Import Library: Use netapi32.lib.
Merci d'avance
Windows XP correspond à Windows NT 5.1 (et Vista à Windows NT 6.0), donc c'est bon.
Ca marche en ajoutant le header lmcons.h
Par contre, info est correctement initialiser en Unicode, j'ai les bonnes données, mais en ANSI, je n'ai pas les bonnes données ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <lmcons.h> #include <lmerr.h> #include <lmshare.h> #include <lmapibuf.h> #include <lmwksta.h> void CSessionObserver::GetInfos() { NET_API_STATUS status; LPBYTE buf; LPWKSTA_INFO_102 info; status = NetWkstaGetInfo(NULL, 102, &buf); if (!status) info = (LPWKSTA_INFO_102) buf; }
Puis, avec la fonction NetWkstaUserEnum(), wkui1_username donne le nom de l'ordinateur, et non pas le nom de celui qui s'est logué.
Apparemment, ces chaînes sont systématiquement en unicode; ce ne sont pas des TCHAR.
Oui, c'est ce qu'indique MSDN, cependant, lorsque je fais F12, j'ai la structure suivante:
Donc, sensé fonctionner aussi bien en Unicode, qu'en ANSI. Mais bon, c'est un détail, je vais me contenter exclusivement de l'Unicode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef struct _WKSTA_INFO_102 { DWORD wki102_platform_id; LPTSTR wki102_computername; LPTSTR wki102_langroup; DWORD wki102_ver_major; DWORD wki102_ver_minor; LPTSTR wki102_lanroot; DWORD wki102_logged_on_users; }WKSTA_INFO_102, *PWKSTA_INFO_102, *LPWKSTA_INFO_102;
Je me demande bien à quoi sert la documentation si tu programmes comme ça ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include <lmcons.h> #include <lmerr.h> #include <lmshare.h> #include <lmapibuf.h> #include <lmwksta.h>
Cherche pas à faire plus compliqué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <windows.h> #include <lm.h>
Non c'est :status = NetWkstaGetInfo(NULL, 102, &buf);
Tu n'as pas besoin de la variable buf, que tu utilises d'ailleurs très mal ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part status = NetWkstaGetInfo(NULL, 102, (LPBYTE)&info);
Windows NT utilise en interne UNICODE et non ANSI. Certaines fonctions ne sont disponibles qu'en version UNICODE ...Par contre, info est correctement initialiser en Unicode, j'ai les bonnes données, mais en ANSI, je n'ai pas les bonnes données ...
Comment veux-tu qu'on sache ce qui ne va pas dans ton programme si tu ne nous montre pas ton code ? Essaie ça :Puis, avec la fonction NetWkstaUserEnum(), wkui1_username donne le nom de l'ordinateur, et non pas le nom de celui qui s'est logué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 #ifndef UNICODE #define UNICODE #endif #include <stdio.h> #include <assert.h> #include <windows.h> #include <lm.h> int wmain(int argc, wchar_t *argv[]) { LPWKSTA_USER_INFO_0 pBuf = NULL; LPWKSTA_USER_INFO_0 pTmpBuf; DWORD dwLevel = 0; DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; DWORD dwResumeHandle = 0; DWORD i; DWORD dwTotalCount = 0; NET_API_STATUS nStatus; LPTSTR pszServerName = NULL; if (argc > 2) { fwprintf(stderr, L"Usage: %s [\\\\ServerName]\n", argv[0]); exit(1); } // The server is not the default local computer. // if (argc == 2) pszServerName = argv[1]; fwprintf(stderr, L"\nUsers currently logged on %s:\n", pszServerName); // // Call the NetWkstaUserEnum function, specifying level 0. // do // begin do { nStatus = NetWkstaUserEnum(pszServerName, dwLevel, (LPBYTE*)&pBuf, dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle); // // If the call succeeds, // if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) { if ((pTmpBuf = pBuf) != NULL) { // // Loop through the entries. // for (i = 0; (i < dwEntriesRead); i++) { assert(pTmpBuf != NULL); if (pTmpBuf == NULL) { // // Only members of the Administrators local group // can successfully execute NetWkstaUserEnum // locally and on a remote server. // fprintf(stderr, "An access violation has occurred\n"); break; } // // Print the user logged on to the workstation. // wprintf(L"\t-- %s\n", pTmpBuf->wkui0_username); pTmpBuf++; dwTotalCount++; } } } // // Otherwise, indicate a system error. // else fprintf(stderr, "A system error has occurred: %d\n", nStatus); // // Free the allocated memory. // if (pBuf != NULL) { NetApiBufferFree(pBuf); pBuf = NULL; } } // // Continue to call NetWkstaUserEnum while // there are more entries. // while (nStatus == ERROR_MORE_DATA); // end do // // Check again for allocated memory. // if (pBuf != NULL) NetApiBufferFree(pBuf); // // Print the final count of workstation users. // fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount); return 0; }
Mais ton MSDN est vieux de 10 ans ... Je vois que tu n'as suivi aucun des liens que je t'ai donné.
...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 typedef struct _WKSTA_INFO_102 { DWORD wki102_platform_id; LMSTR wki102_computername; LMSTR wki102_langroup; DWORD wki102_ver_major; DWORD wki102_ver_minor; LMSTR wki102_lanroot; DWORD wki102_logged_on_users; } WKSTA_INFO_102, *PWKSTA_INFO_102, *LPWKSTA_INFO_102;
wki102_computername
Pointer to a string specifying the name of the local computer.
This string is Unicode if _WIN32_WINNT or FORCE_UNICODE are defined.
...
C'est vrai que je n'avais pas suivi les liens que tu m'avais donné.
J'avais copié le nom des fonctions, et les avais copié dans mon MSDN, car selon moi c'est plus rapide à charger, et mon MSDN correspond à la version de Visual C++ que j'ai 6.0, alors que si je prends un MSDN externe, alors il peut avoir des différences (par exemple fopen, il y a l'option encoding à partir de 2003 qui n'existe pas dans ma version).
J'avoue que je ne suis pas à l'aise avec l'API Windows, je suis habitué au standard sous l'environnement Unix et j'ai encore un peu de mal, mais bon, pas le choix, je dois m'adapter.
Bref, avec l'exemple que tu m'as donné, ça marche, je te remercie infiniment (ainsi que les autres intervenants).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager