WinAPI获取系统用户信息
2015-03-05 16:19
253 查看
http://www.it165.net/pro/html/201211/4263.html
今天在写一个辅助软件的时候需要获取当前登录用户的信息,翻MSDN找到了一些结果,但是并不是很有帮助,于是找了一下之前的笔记,找出了下面的代码段,这些代码应该是参考了某本教程(高中时候的事了,不是很清楚)如果涉及到版权问题,请联系我,我会第一时间删除这篇post。
代码如下:
view
sourceprint?
今天在写一个辅助软件的时候需要获取当前登录用户的信息,翻MSDN找到了一些结果,但是并不是很有帮助,于是找了一下之前的笔记,找出了下面的代码段,这些代码应该是参考了某本教程(高中时候的事了,不是很清楚)如果涉及到版权问题,请联系我,我会第一时间删除这篇post。
代码如下:
view
sourceprint?
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.
}
相关文章推荐
- sqlserver 获取系统用户表结构信息
- 超强获取计算机信息类(可获取cpu序列号,网卡地址,ip地址,硬盘id,登录系统用户,计算机名等等)
- WinAPI: GetSystemMetrics - 获取系统度量等数值信息
- UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息
- 在Linux系统中使用who和whoami命令获取用户信息
- 获取系统信息,地理位置,用户信息
- 笔记:Linux shell(三):获取系统和用户信息
- actionscript获取用户系统信息
- 一些获取当前登录Windows系统用户信息的命令
- 【UWP开发】如何通过UWP获取系统用户Gamertag或者UserName等用户信息
- java获取系统信息:java的信息、操作系统的信息、用户的信息、虚拟机的信息、系统设置的信息。
- 【UWP开发】如何通过UWP获取系统用户Gamertag或者UserName等用户信息
- WinAPI: GetSystemPowerStatus - 获取系统电源状态的信息
- vc api_获取系统信息和用户信息
- vc api_获取系统信息和用户信息
- iOS调用系统的通讯录界面获取用户信息
- WinAPI: GetSystemInfo - 获取系统信息
- Android系统获取用户来电信息
- WinAPI: GetSystemMetrics - 获取系统度量等数值信息
- c#获取系统信息:CPU、内存、硬盘、用户、网络