📄 9.1.2 信任成员的管理.htm
字号:
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>usri1_priv</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>当您在建立使用者时,这个成员的值必须设定为USER_PRIV_USER。任何其他的值将会导致NetUserAdd传回ERROR_INVALID_PARAMETER。</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>USER_PRIV_PARMNUM</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>usri1_home_dir</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>使用者可以为其帐户定义主目录。假如您想要联合主目录与新的使用者,此成员应该要指向一个包含Unicode字串目录路径的缓冲器。您可以指派NULL给这个成员。</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>USER_HOME_DIR_PARMNUM</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>usri1_comment</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>这个成员指向一个包含新使用者的Unicode注解缓冲器。假如您不想要结合注解与新的使用者帐户,可以指派NULL给这个成员。</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>USER_COMMENT_PARMNUM</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>usri1_flags</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>这个成员可以结合指示新使用者帐户功能的标记(请见 <A
style="LINE-HEIGHT: 25px"
href="http://www.acejoy.com/doc/serverside/9.htm#999_1"
target=_new>表9-4</A> )。</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>USER_FLAGS_PARMNUM</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>usri1_script_path</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>当使用者登入系统时,系统将执行与您的使用者结合之
.exe、.cmd或.bat档。您可以使用此成员来设定登入指令档的路径。</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>USER_SCRIPT_PATH_PARMNUM</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>呼叫NetUserAdd时,表9-4中任何一种标记的结合都可以被指派给USER_INFO_1的usri1_flags成员,其他的标记则可用来指定额外的特征。有关这些其他标记的资讯,请参阅《Platform
SDK》文件。</FONT></P><A style="LINE-HEIGHT: 25px" name=999_1></A>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR>
<TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial
color=#000000 size=2><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 表9-4 </B></FONT>与USER_INFO_1有关的标记</FONT></TD></TR></TBODY></TABLE></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=1>
<TBODY style="LINE-HEIGHT: 25px">
<TR>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>标记</FONT> </TH>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>叙述</FONT></TH></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_ACCOUNTDISABLE</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>建立一个无效的帐户。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_PASSWD_NOTREQD</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>建立一个不需要密码的帐户。对于要求所有帐户都需使用密码的系统或网域来说,可能是个适当的原则。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_PASSWD_CANT_CHANGE</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>建立一个使用者无法改变自己密码的帐户。系统管理者仍旧可以改变密码。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_DONT_EXPIRE_PASSWD</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>这个使用者的密码永不过期。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_NOT_DELEGATED</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>这个帐户不能被委派(有关委派的讨论,请参阅 <A style="LINE-HEIGHT: 25px"
href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_211.xml#"
target=_new>第十一章</A> 及 <A style="LINE-HEIGHT: 25px"
href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_212.xml#"
target=_new>十二章</A> )。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_SMARTCARD_REQUIRED</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>要求使用者使用智慧卡登入这个新帐户。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>UF_TRUSTED_FOR_DELEGATION</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>这个帐户可被委派(有关委派的讨论,请参阅 <A style="LINE-HEIGHT: 25px"
href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_211.xml#"
target=_new>第十一章</A> 及 <A style="LINE-HEIGHT: 25px"
href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_212.xml#"
target=_new>十二章</A> )。</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>不管它看起来像什么,用NetUserAdd来建立新使用者帐户之最低编写程序必要条件实际上是非常合理的。以下的程序代码说明了最简单的实例:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL CreateUser(PWSTR pszSystem, PWSTR pszName, PWSTR pszPassword){ <BR> USER_INFO_1 userInfo ={0 }; <BR> userInfo.usri1_name = pszName; <BR> userInfo.usri1_password = pszPassword; <BR> userInfo.usri1_priv = USER_PRIV_USER; <BR> NET_API_STATUS netStatus = <BR> NetUserAdd(pszSystem, 1, (PBYTE) &userInfo, NULL); <BR> return(netStatus == NERR_Success); <BR>}</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如您所见,这是个相当琐碎的程序代码,用来在给定的系统上与给定的名称及密码建立一位使用者。使用以下的方式呼叫此范例函数将会在本机系统上建立一个名字为「MrMan」,密码为「HowDoYouDo」的使用者:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">CreateUser(NULL, L"MrMan", L"HowDoYouDo");</PRE></FONT></DIV>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>ADSI套件也可被用来建立使用者帐户。如同群组物件一般,可以在任何的容器物件中建立使用者物件。您可以使用IADsContainer介面的Create成员建立一个使用者物件。一旦建立了这个物件,便可以使用QueryInterface方法,以取得IADsUser介面的指标,它可被用来进一步地管理您的新使用者物件。有关这个主题的细节,请参阅《Platform
SDK》文件。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">设定使用者及群组资讯<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>系统也为了取得及设定已被建立之使用者或群组帐户的资讯而提供Net函数。您可以看到这些函数的呼叫格式与NetGroupAdd及NetUserAdd非常类似。要取得及设定使用者帐户资讯,可以使用NetUserGetInfo及NetUserSetInfo函数,其原型如下:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">NET_API_STATUS NetUserGetInfo( <BR> PCWSTR pszServerName, <BR> PCWSTR pzUsername, <BR> DWORD dwLevel, <BR> PBYTE *ppbBuf); <BR>NET_API_STATUS NetUserSetInfo( <BR> PCWSTR pszServerName, <BR> PCWSTR pszUsername, <BR> DWORD dwLevel, <BR> PBYTE pbBuf, <BR> PDWORD pdwParmErr);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如您所见,NetUserGetInfo及NetUserSetInfo函数拥有几乎跟NetUserAdd一样的参数清单。事实上,唯一额外的参数是pstrUsername,它指出被取得或设定资讯的使用者名称。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>请注意NetUserGetInfo的部份,其pbBuf参数已经被改成缓冲器的指标位址。如同先前所指出的,这是因为系统实际上会指派被要求的结构给您,并经由ppbBuf参数在变数中传回一个指向新缓冲器的指标。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>dwLevel参数指出在呼叫NetUserGetInfo或NetUserSetInfo中,将会使用到的USER_INFO_*
结构level。这些函数接受USER_INFO_1或USER_INFO_3,如同前面所定义的,以及NetUserAdd不支援的其他几个USER_INFO_*
结构。有关这些结构的完整叙述,请参考《Platform SDK》文件。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>设定使用者资讯时,您应该使用一个只包含您想设定的资讯或接受NULL,如同一个成员值的结构level。举例来说,仅设定使用者帐户的密码可以使用USER_INFO_1003结构类型,因为它只为使用者的新密码包含一个成员。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>以下的两个范例函数,说明了如何使用NetUserSetInfo及NetUserGetInfo来设定和取得使用者帐户资讯的方法。第一个函数显示如何为使用者帐户设定密码;第二个函数则说明如何撷取使用者的注解栏位。这些函数使用的原则可以为使用者帐户取得或设定任何有效的资讯。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL SetUserPassword(PWSTR pszSystem, PWSTR pszName, PWSTR pszPassword){ <BR> USER_INFO_1003 userInfo = {0}; <BR> userInfo.usri1003_password = pszPassword; <BR> NET_API_STATUS netStatus = <BR> NetUserSetInfo(pszSystem, pszName, 1003, (PBYTE) &userInfo, NULL); <BR> return (netStatus == NERR_Success); <BR>} <BR>BOOL GetUserComment(PWSTR pszSystem, PWSTR pszName, PWSTR pszComment, <BR> int nBufLen){ <BR> USER_INFO_10 *puserInfo; <BR> BOOL fSuccess = FALSE; <BR> NET_API_STATUS netStatus = <BR> NetUserGetInfo(pszSystem, pszName, 10, (PBYTE*) &puserInfo); <BR> if (netStatus == NERR_Success){ <BR> if (nBufLen > lstrlen(puserInfo->usri10_comment)) { <BR> lstrcpy(pszComment, puserInfo->usri10_comment); <BR> fSuccess = TRUE; <BR> } <BR> NetApiBufferFree(puserInfo); <BR> } <BR> return(fSuccess); <BR>}</PRE></FONT></DIV>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>所有成功呼叫的NetUserGetInfo必须呼叫NetApiBufferFree,以释放NetUserGetInfo传回的缓冲器。NetApiBufferFree函数被定义为取得一个参数,它是被释放的缓冲器指标。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您可能已经猜到,系统也提供了类似的函数,用来取得及设定群组信任成员帐户的资讯。要取得信任成员资讯,您可以呼叫NetLocalGroupGetInfo;而设定群组资讯则要呼叫NetLocalGroupSetInfo。这些函数定义如下:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">NET_API_STATUS NetLocalGroupGetInfo( <BR> PCWSTR pservername, <BR> PCWSTR groupname, <BR> DWORD dwLevel, <BR> PBYTE *ppbBuf); <BR>NET_API_STATUS NetLocalGroupSetInfo( <BR> PCWSTR servername, <BR> PCWSTR groupname, <BR> DWORD dwLevel, <BR> PBYTE pbBuf, <BR> PDWORD pdwParmErr);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如您所见,呼叫这些函数与呼叫取得及设定使用者帐户资讯的函数几乎完全相同,差别在于您要处理的群组资讯及先前讨论的LOCALGROUP_INFO_*
结构。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>请记得群组成员资讯也与群组帐户一起储存,尽管名称及注解看起来可能是与群组帐户结合的最少资讯。由于它与SID主题密切相关,所以这个主题将延到本章的最后部分,在稍后的〈认识SIDs〉一节中将讨论SIDs内容。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">列举使用者及群组<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>通常会在给定的系统上取得现存使用者或群组的清单。再一次地说明,Net
API提供两个类似的函数来执行这些任务。您可以使用NetLocalGroupEnum去取得系统上的群组清单;同样地,也可以使用NetUserEnum取得系统上使用者帐户的清单。这些函数定义如下:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">NET_API_STATUS NetLocalGroupEnum( <BR> PCWSTR pszServerName, <BR> DWORD dwLevel, <BR> PBYTE* ppbBuf, <BR> DWORD dwPrefMaxLen, <BR> PDWORD pdwEntriesRead, <BR> PDWORD pdwTotalEntries, <BR> PDWORD_PTR pdwResumeHandle); <BR>NET_API_STATUS NetUserEnum( <BR> PCWSTR pszServerName, <BR> DWORD dwLevel, <BR> DWORD dwFilter, <BR> PBYTE* ppbBuf, <BR> DWORD dwPrefMaxLen, <BR> PDWORD pdwEntriesRead, <BR> PDWORD pdwTotalEntries, <BR> PDWORD_PTR pdwResumeHandle);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这些函数很类似,但有一些差别值得注意。从LOCALGROUP_INFO_*
结构集中传回结构到NetLocalGroupEnum的同时,将会从USER_INFO_*
结构集传回结构到NetUserEnum函数。此外,NetUserEnum可让您指定筛选条件,以减少使用者帐户清单传回的范围。传递0给NetUserEnum的filter参数,表示没有筛选条件,所以任何的帐户类型都会被传回。您通常要传递FILTER_NORMAL_ACCOUNT给filter参数;然而,您也可以传递表9-5中列出的任何一个值。</FONT></P>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR>
<TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial
color=#000000 size=2><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 表9-5 </B></FONT>可以传递给NetUserEnum的filter参数的筛选条件值</FONT></TD></TR></TBODY></TABLE></CENTER>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -