您的位置:首页 > 其它

WinAPI获取系统用户信息

2015-03-05 16:19 253 查看
http://www.it165.net/pro/html/201211/4263.html

今天在写一个辅助软件的时候需要获取当前登录用户的信息,翻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.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: