WinAPI获取系统用户信息

http://www.it165.net/pro/html/201211/4263.html


今天在写一个辅助软件的时候需要获取当前登录用户的信息,翻MSDN找到了一些结果,但是并不是很有帮助,于是找了一下之前的笔记,找出了下面的代码段,这些代码应该是参考了某本教程(高中时候的事了,不是很清楚)如果涉及到版权问题,请联系我,我会第一时间删除这篇post。
代码如下:

001. #ifndef UNICODE
002. #define UNICODE
003. #endif
004. #include <stdio.h>
005. #include <assert.h>
006. #include <windows.h>
007. #include <lm.h>
008.  
009. /*************************************
010. * AddUser
011. * 功能    增加用户
012. * 参数    szServerName,主机名,如果为本机增加用户,设置为NULL
013. *           szUserName,用户名
014. *           szPass<a href="http://www.it165.net/edu/ebg/" target="_blank" class="keylink">word</a>,密码
015. **************************************/
016. int AddUser(LPWSTR szServerName,
017. LPWSTR szUserName,
018. LPWSTR szPass<a href="http://www.it165.net/edu/ebg/" target="_blank" class="keylink">word</a>)
019. {
020. USER_INFO_1 ui;
021. DWORD dwLevel = 1;  // 使用 USER_INFO_1 作为参数
022. DWORD dwError = 0;
023. NET_API_STATUS nStatus;
024. // 填充 USER_INFO_1
025. ui.usri1_name = szUserName; // 用户名
026. ui.usri1_password = szPassword; // 密码
027. ui.usri1_priv = USER_PRIV_USER; // privilege 
028. ui.usri1_home_dir = NULL;
029. ui.usri1_comment = NULL;
030. ui.usri1_flags = UF_SCRIPT;
031. ui.usri1_script_path = NULL;
032. // 调用 NetUserAdd 增加用户
033. nStatus = NetUserAdd(szServerName,
034. dwLevel,
035. (LPBYTE)&ui,
036. &dwError);
037.  
038. // 判断结果
039. if (nStatus == NERR_Success)
040. {
041. wprintf(stderr, L"User %s has been successfully added on %s\n",
042. szUserName, szServerName);
043. }
044. else
045. {
046. fprintf(stderr, "A system error has occurred: %d\n", nStatus);
047. }
048. return 0;
049. }
050.  
051. /*************************************
052. * AddUserToGroup
053. * 功能    为用户组增加用户
054. * 参数    szServerName,主机名,如果为本机,设置为NULL
055. *           szUserName,用户名
056. *           szGroup,用户组名
057. **************************************/
058. int AddUserToGroup(LPWSTR szServerName,
059. LPWSTR szUserName, 
060. LPWSTR szGroup)
061. {
062. NET_API_STATUS nStatus;
063. // 调用 NetGroupAddUser
064. nStatus =  NetGroupAddUser(
065. szServerName,
066. szGroup,
067. szUserName
068. );
069.  
070. // 判断结果
071. if (nStatus == NERR_Success)
072. fwprintf(stderr, L"User %s has been successfully added on %s\n",
073. szUserName, szServerName);
074.  
075. else
076. fprintf(stderr, "NetGroupAddUser A system error has occurred: %d\n", nStatus);
077. return 0;
078. }
079.  
080. /*************************************
081. * DelUser
082. * 功能    删除用户
083. * 参数    szServerName,主机名,如果为本机,设置为NULL
084. *           szUserName,用户名
085. **************************************/
086. int DelUser(LPWSTR szServerName, LPWSTR szUserName)
087. {
088. DWORD dwError = 0;
089. NET_API_STATUS nStatus;
090.  
091. // 调用 NetUserDel 删除用户
092. nStatus = NetUserDel(szServerName, szUserName);
093. // 判断并显示结果
094. if (nStatus == NERR_Success)
095. fwprintf(stderr, L"User %s has been successfully deleted on %s\n",
096. szUserName, szServerName);
097. else
098. fprintf(stderr, "A system error has occurred: %d\n", nStatus);
099.  
100. return 0;
101.  
102. }
103.  
104. /*************************************
105. * int ListUsers(LPWSTR pszServerName)
106. * 功能    列举用户
107. * 参数    szServerName,主机名,如果为本机,设置为NULL
108. **************************************/
109. int ListUsers(LPWSTR pszServerName)
110. {
111. LPUSER_INFO_0 pBuf = NULL;
112. LPUSER_INFO_0 pTmpBuf;
113. DWORD dwLevel = 0;
114. DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
115. DWORD dwEntriesRead = 0;
116. DWORD dwTotalEntries = 0;
117. DWORD dwResumeHandle = 0;
118. DWORD i;
119. DWORD dwTotalCount = 0;
120. NET_API_STATUS nStatus;
121.  
122. // 循环,直到可以成功调用 NetUserEnum
123. do
124. {
125. // 调用NetUserEnum函数
126. nStatus = NetUserEnum(pszServerName,
127. dwLevel,// 这里设置为0,使用 LPUSER_INFO_0 返回结果
128. FILTER_NORMAL_ACCOUNT, // 只列举“正常”类型的用户
129. (LPBYTE*)&pBuf,// LPUSER_INFO_0 保存返回结果
130. // MAX_PREFERRED_LENGTH,内存由API分配,需要在之后调用NetApiBufferFree释放
131. dwPrefMaxLen,
132. &dwEntriesRead,// 读了的 Entries
133. &dwTotalEntries,// 一共的 Entries
134. &dwResumeHandle);
135. // 判断是否成功
136. if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
137. {
138. if ((pTmpBuf = pBuf) != NULL)
139. {
140. // 循环读取用户信息
141. for (i = 0; (i < dwEntriesRead); i++)
142. {
143. assert(pTmpBuf != NULL);
144.  
145. if (pTmpBuf == NULL)
146. {
147. fprintf(stderr, "An access violation has occurred\n");
148. break;
149. }
150. // 输出
151. wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);
152. // 下一个
153. pTmpBuf++;
154. dwTotalCount++;
155. }
156. }
157. }
158. else
159. fprintf(stderr, "A system error has occurred: %d\n", nStatus);
160. // 释放内存
161. if (pBuf != NULL)
162. {
163. NetApiBufferFree(pBuf);
164. pBuf = NULL;
165. }
166. }
167. while (nStatus == ERROR_MORE_DATA); // end do
168.  
169. // 释放内存
170. if (pBuf != NULL)
171. NetApiBufferFree(pBuf);
172.  
173. fprintf(stderr, "Total of %d users\n\n", dwTotalCount);
174.  
175. return 0;
176. }
177.  
178. /*************************************
179. * int ListGroup(LPWSTR pszServerName)
180. * 功能    列举用户组 www.it165.net
181. * 参数    szServerName,主机名,如果为本机,设置为NULL
182. **************************************/
183. int ListGroup(LPWSTR pszServerName)
184. {
185.  
186. DWORD dwLevel = 0;
187. DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
188. DWORD dwEntriesRead = 0;
189. DWORD dwTotalEntries = 0;
190. DWORD dwResumeHandle = 0;
191. DWORD i;
192. DWORD dwTotalCount = 0;
193. NET_API_STATUS nStatus;
194.  
195.  
196. LPLOCALGROUP_INFO_0 pBuf = NULL;
197. LPLOCALGROUP_INFO_0 pTmpBuf;
198.  
199. do // begin do
200. {
201. // 调用NetLocalGroupEnum 参数设置与NetLocalGroup类似
202. nStatus = NetLocalGroupEnum(
203. pszServerName,
204. 0,
205. (LPBYTE*)&pBuf,
206. dwPrefMaxLen,
207. &dwEntriesRead,
208. &dwTotalEntries,
209. &dwResumeHandle);
210. // 判断结果
211. if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
212. {
213. if ((pTmpBuf = pBuf) != NULL)
214. {
215. // 循环输出
216. for (i = 0; (i < dwEntriesRead); i++)
217. {
218. assert(pTmpBuf != NULL);
219.  
220. if (pTmpBuf == NULL)
221. {
222. fprintf(stderr, "An access violation has occurred\n");
223. break;
224. }
225.  
226. wprintf(L"\t-- %s\n", pTmpBuf->lgrpi0_name);
227. pTmpBuf++;
228. dwTotalCount++;
229. }
230. }
231. }
232.  
233. else
234. fprintf(stderr, "A system error has occurred: %d\n", nStatus);
235. // 释放内存
236. if (pBuf != NULL)
237. {
238. NetApiBufferFree(pBuf);
239. pBuf = NULL;
240. }
241. }
242.  
243. while (nStatus == ERROR_MORE_DATA); // end do
244.  
245. if (pBuf != NULL)
246. NetApiBufferFree(pBuf);
247.  
248. fprintf(stderr, "Total of %d groups\n\n", dwTotalCount);
249.  
250. return 0;
251. }
252.  
253. /*************************************
254. * ShowUsersInfo
255. * 功能    显示指定用户的信息
256. * 参数    szServerName,主机名,如果为本机,设置为NULL
257. *           pszUserName,用户名
258. **************************************/
259. int ShowUsersInfo(LPWSTR pszServerName,LPWSTR pszUserName)
260. {
261.  
262. DWORD dwLevel = 4;// 使用 LPUSER_INFO_4 返回结果
263. LPUSER_INFO_4 pBuf = NULL;
264. NET_API_STATUS nStatus;
265.  
266. nStatus = NetUserGetInfo(pszServerName,
267. pszUserName,
268. dwLevel,    // pBuf参数类型
269. (LPBYTE *)&pBuf);
270.  
271. // 判断并输出结果
272. if (nStatus == NERR_Success)
273. {
274. if (pBuf != NULL)
275. {
276. wprintf(L"\n\tAccount:      %s\n", pBuf->usri4_name);
277. wprintf(L"\tComment:      %s\n", pBuf->usri4_comment);
278. wprintf(L"\tUser comment: %s\n", pBuf->usri4_usr_comment);
279. wprintf(L"\tFull name:    %s\n", pBuf->usri4_full_name);
280. wprintf(L"\tpriv:    %d\n", pBuf->usri4_priv);
281. }
282. }
283.  
284. else
285. fprintf(stderr, "A system error has occurred: %d\n", nStatus);
286. // 释放内存
287. if (pBuf != NULL)
288. NetApiBufferFree(pBuf);
289. return 0;
290.  
291. }
292.  
293. /*************************************
294. * wmain
295. * 功能    入口函数,根据参数判断需要调用的功能函数
296. * 参数    参见usage输出
297. **************************************/
298. int __cdecl wmain(int ac, wchar_t * av[])
299. {
300.  
301. if (ac == 4 && lstrcmpW( av[1], L"-a") == 0)
302. {
303. AddUser(NULL, av[2], av[3]);
304. }
305.  
306. else if (ac == 4 && lstrcmpW( av[1], L"-g") == 0)
307. {
308. AddUserToGroup(NULL, av[2], av[3]);
309. }
310. else    if (ac == 3 && lstrcmpW( av[1], L"-i") == 0)
311. {
312. ShowUsersInfo(NULL, av[2]);
313. }
314. else    if (ac == 2 && lstrcmpW( av[1], L"-i") == 0)
315. {
316. ListUsers(NULL);
317. ListGroup(NULL);
318. }
319. else    if (ac == 3 && lstrcmpW( av[1], L"-d") == 0)
320. {
321. DelUser(NULL, av[2]);
322. }
323. else
324. {
325. printf("usage: \n"
326. "\t %ws -a <username> <password> to add a user\n"
327. "\t %ws -g <username> <group> add a user to a group"
328. "\t %ws -i <username> to show user info\n"
329. "\t %ws -d <username> to del a user\n",
330. av[0], av[0], av[0], av[0]);
331. }
332. return 0;
333. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值