如何得到NT/2000的用户及权限列表 (50分)

  • 主题发起人 主题发起人 wengyz
  • 开始时间 开始时间
在WinNT/2000网络邻居中获取所有的工作组:
通过调用API函数 WnetOpenEnum()和WnetEnumResource可以列举网络资源,在Win2000下此函数可以得到所有的工作组名

在函数WNetOpenEnum中,将参数lpNetResource指定为一种网络类型信息,可以获取一个句柄,在函数WNetEnumResource中利用这个句柄,就可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个工作组名称(如"MyWorkGroup")。

获取指定工作组内的所有计算机列表:
在函数WnetOpenEnum API中,将参数lpNetResource中的lpRemoteName部分指定为一个工作组的名称(如"MyWorkGroup"),可以获取一个句柄,在函数WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个计算机名称。
 
用IAdsUser对象,参考:
http://msdn.microsoft.com/library/en-us/netdir/adsi/iadsuser.asp?frame=true
 
可能是我说的不清楚,应该是如何得到NT/2000的用户及权限列表
 
1 NT的域用户管理器介绍

NT的“域用户管理器”是用来管理域、成员服务器和工作站安全性的工具。使用“域用户管理器”可以:选定要管理的域或计算机; 创建和管理用户帐号; 创建和管理组;管理安全性规则。
多数情况下,首次启动“域用户管理器”时,将显示登录域。标题栏显示域名而“域用户管理器”主窗口显示两个列表。上端列表包括用户帐号,下端列表包括组帐号。可以选定一个或多个用户帐号或一个组帐号,并使用“用户”菜单上的命令管理它们。在使用域管理器的时候,需要进行安全性规则的限定,所谓安全性规则,包括帐号规则、用户权力规则、审核规则、委托关系。
帐号规则:帐号规则控制用户帐号使用密码密码的方式。通过帐号规则可以定义如最大密码密码期限、最小密码密码长度以及是否维护密码历史记录及在更改密码之前用户是否必须登录。帐号规则也决定帐号封锁。密码启用锁定时,如果在指定时间内,发生多次到某帐号的登录失败后,则不能登录到该用户帐号。试图使用错误的旧密码更改密码时也会出现锁定。在管理员解除锁定或经过指定时间之前,锁定帐号保持锁定。帐号规则也决定当用户登录时间过期时,是否强制远程用户与域断开连接。
用户权力规则:“用户权力”规则管理授予组和用户帐号的权力。权力授权用户可以在系统上执行某种操作。用户登录到授予适当权力的帐号则可以执行相应操作。当用户不具备相应的权力时,系统禁止执行这些操作。用户权力适用于整个系统,而权限适用于指定对象,两者是不相同的。授予组的权力实际上授予给该组成员。多数情况下,给用户提供权力的最简单方法是将该用户帐号添加到内置组中具有相应权力的某个组中,而无需通过管理“用户权力”规则实现。
审核规则:通过审核安全性事件并且在安全日志中保存数据,可以跟踪选定用户的活动。“审核”规则指定要记录的安全性事件类型。这些类型涉及从系统范围的事件(例如用户登录)到指定事件(例如某用户试图读取某个特定文件)。这些事件类型包括成功事件、不成功事件或兼而有之。管理域时,“审核”规则影响所有域控制器的安全日志。管理非域控制器计算机时,“审核”规则仅影响该台计算机(运行 Windows NT Workstation 或 Windows NT Server)的安全日志。可以使用“事件查看器”查看安全日志中的事件。
委托关系:委托关系是两个 Windows NT Server 域之间的链接。使用委托关系添加和删除委托域(资源域)及受托域(帐号域)委托关系允许用户使用单个用户帐号及单个密码访问整个网络上的资源。这就将域级的集中管理便利升为网络级了。
2 NT命令行使用程序的使用

Net Group和Net User 命令行实用程序是NT下的两个管理域用户的重要程序。它可以完成NT域用户管理器所能完成的所有功能,其区别仅在于不具备友好的界面。故可以考虑在扩展用户管理时加以调用。而Cacls命令行实用程序则用于对目录和文件实施系统安全性规则。
Net Group命令行实用程序用于在Windows NT Server 域中添加、显示或更改全局组。该命令仅在 Windows NT Server 域中可用。其基本使用格式如下:
net group [groupname [/comment:"text "]] [/domain]
net group groupname {/add [/comment:"text "] | /delete} [/domain]
net group groupname username [ ...] {/add | /delete} [/domain]
命令相关的参数如下:
groupname 要添加、扩展或删除的组。仅提供某个组名便可查看组中的用户列表。
/comment:"text " 为新建组或现有组添加注释。注释最多可以是 48 个字符。
/domain 在当前域的主域控制器中执行该操作,否则在本地计算机上执行操作。该参数仅用于作为 Windows NT Server 域成员的 Windows NT Workstation 计算机。Windows NT Server 计算机默认为在主域控制器中操作。
username[ ...] 列表显示要添加到组或从组中删除的一个或多个用户。
/add 添加组或在组中添加用户名,须用该命令为添加到组中的用户建帐号。
/delete 删除组或从组中删除用户名。
注意:键入不带参数的 net group 可以显示服务器名称及服务器的组名称。
Net User命令行实用程序用于添加或更改用户帐号或显示用户帐号信息。其基本使用格式如下: net user [username [password | *] [options]] [/domain]
net user username {password | *} /add [options] [/domain]
net user username [/delete] [/domain]
主要命令相关的参数如下:
username 添加、删除、更改或查看用户帐号名。用户帐号名最多可以有 20 个字符。
Password 为用户帐号分配或更改密码。密码必须满足在 net accounts 命令 /minpwlen
选项中设置的最小参数。最多是 14 个字符。
* 提示输入密码。在密码提示行中键入密码时,将不显示该密码。
/add 将用户帐号添加到用户帐号数据库。
/delete 从用户帐号数据库中删除用户帐号。
/active:{no | yes} 启用或禁止用户帐号。
/expires:{date | never} 如果设置 date,将导致用户帐号过期,never 不对用户帐号设置时间限制。过期日期值可以是下列格式: mm/dd/yy、dd/mm/yy 或 mmm, dd, yy。
/fullname:"name" 指定用户全名而不是用户名。用引号将名字引住。
/homedir:path 设置用户宿主目录的路径。该路径必须存在。
/homedirreq:{yes | no} 设置是否需要宿主目录。
/profilepath:[path] 设置用户登录配置文件的路径。该路径名指向注册表配置文件。
/scriptpath:path 为用户登录脚本设置路径。
/times:{times | all} 指定允许用户使用计算机的时间。
注意:在运行 Windows NT Server 的计算机上键入 net user 命令时,主域控制器将自动更改用户帐号数据库并复制到备份域控制器中。此功能仅适用于 Windows NT Server 域。键入不带参数的 net user 将查看计算机上的用户帐号列表。
Cacls命令行实用程序用于显示或修改文件访问控制表(ACL),即对目录或文件的安全信息进行设置。其基本使用格式为:
cacls filename [/t] [/e] [/c] [/g user:perm] [/r user [...]] [/p user:perm [...]] [/d user [...]]
命令相关的参数如下:
filename 显示文件或指定文件的访问控制表 ACL 。
/t 在当前目录及所有子目录下改变指定文件的 ACL 。
/e 编辑 ACL,但不替换。
/c 继续更改 ACL,并忽略错误。
/g user:perm 将访问权授予指定用户。Perm 可以是:(r读取、c更改、f完全控制)
/r user 撤消指定用户的访问权。
/p user:perm 还原指定用户的访问权。Perm 可以是:(n无、r读取、c更改、f完全控制)
/d user 拒绝指定用户的访问。
注意:可以在一个命令中指定多个文件或用户。



3 建立用户组及组管理员并设置安全信息基本实现步骤

通常在建立用户组的时候,需要建立一个和组名相匹配的用户目录,并设置此目录的安全性使得该目录只能被管理员和该组成员访问。现在建立一个名为“实验组A”的用户组,并为该组设立一个管理员,可以执行下面的批命令:
Net Group 实验组A /Add /Comment:"建立用户组实验" //建立组
Net User Admin_LabA /Add /Comment:"实验组A管理员" //建立组管理员
Net Group 实验组A Admin_LabA /Add //将组管理员加入组
再为此组建立一个私有目录,执行下面的命令:
Md //ServerName/STUDENT/实验组A
Cacls //ServerName/STUDENT/实验组A /r everyone /e /t
Cacls //ServerName/STUDENT/实验组A /g 实验组A:r /e /t
Cacls //ServerName/STUDENT/实验组A /g Administrator:f /e /t
Cacls //ServerName/STUDENT/实验组A /g Admin_LabA:f /e /t
现在建立该组下的一般成员,运行下面的命令:
Net User User001 /Add /Comment:"实验组A一般用户"
Net Group 实验组A User001 /Add
为该用户建立自己的私有目录(此目录将只能由管理员、该组管理员和User001访问)
Md //ServerName/STUDENT/实验组A/User001
Cacls //ServerName/STUDENT/实验组A /r 实验组A:r /e /t
Cacls //ServerName/STUDENT/实验组A/User001 /g User001:f /e /t

以上是利用NT的Net Group和Net User命令行使用程序来扩展NT用户管理的基本原理和步骤。当然建立了新的用户和用户组之后意味着将来需要将它们删除,现在每个用户都有自己的私有目录,我们需要在删除用户和用户组之前就把它们对应的私有目录删除。如果只删除单个用户,可以执行下面的命令:
Deltree /Y //ServerName/STUDENT/实验组A/User001
Net User User001 /Delete
如果需要删除整个用户组及其用户(必须在建立用户的同时将用户名称写入该组的用户名集合文件,以便删除用户组时能够找到对应的用户),我们需要执行:
Deltree /Y //ServerName/STUDENT/实验组A
Net User User001 /Delete ...
... Net User Userxxx /Delete
Net Group 实验组A /Delete


4 小结

对于NT的域管理,不少系统管理人员感到在使用的时候非常不方便,决大多数的操作人员倾向于Netware4.x以上版本中的NDS。虽然微软公司正着力将NDS的优点带入NT的较高版本,至少目前,我们仍然没有一个很理想的管理工具。虽然NT提供了非常友好的界面来帮助操作人员实施用户管理,但其实际效果并不尽人意。在其基础上利用NT现有的实用程序进行少量的编程扩展其功能,不失为一种不错的解决方法。
在实际应用中,笔者采用Delphi作为开发平台设计了一个自己的用户管理窗口,不仅具有良好的交互性,又扩展了NT自身用户管理器的功能。作为一种利用系统基本功能扩充系统现有图形应用程序的功能的范例,这种思路是具有长远意义的。
 
---- 1. 前言

---- Windows NT是一个多任务、多用户的网络操作系统,是构建在域、组、帐号模式上的网络管理体制。在NT构建的局域网中,一般由一台主域控制器(NT Server)负责集中管理NT网域帐号,较之以往传统工作组独立式目录数据服务,NT网域采用了共享用户数据库的管理形式,从而解决了用户数据库各项繁索的维护操作,管理员可以在主域控制器上统一管理。

---- 由于NT网域帐号是基于共享用户数据库的管理方式,网络管理员可以在网域内的任一工作站上使用超级用户(Administrator帐号)登录,远程维护帐号。但这种远程管理也仅仅局限于本域工作站而言。本文中,笔者实现了基于TCP/IP协议的远程帐号管理,解决了NT网域帐号只能在本域中远程维护的弊端。

---- 2. 网域用户帐号数据结构

---- 在主域控制器上有一Security Accounts Management(SAM)数据库,用于存放被授权访问NT系统的用户、组和计算机帐户的基本数据。SAM在域的控制程序间被共享。NT的SAM的最大空间为40MB,每个用户的帐号属性需要1KB,每个计算机帐户需要0.5KB,每个组帐户需要4KB。NT网域用户帐号数据结构如表1所示,表中数据类型为Visual Basic的数据类型。在实际NT网域管理工作中,经常使用的是用户名(Name)、全称(FullName)、

;

---- 描述(Comment)、密码(Password)、用户不得更改密码(NoChangePwd)、密码永久有效(NoExpirePwd)、帐号暂时禁用(AccDisabled)、帐号有效期限等几个属性。如图1为NT Server中管理用户帐号的界面。

---- 表1 NT网域用户帐号参数表

参 ;数 ; ; ; ; ; ; ;数据类型 ; ; ; ; ; ;备 ;注
UserID ; ; ; ; ; ; ; ;Long ; ; ; ; ; 用户ID号
Name ; ; ; ; ; ; ; String ; ; ; ; ; 用户名
FullName ; ; ; ; ; String ; ; ; ; ; 用户全称
Comment ; ; ; ; ; ; ; String ; ; ; ; ; 帐号描述
Password ; ; ; ; ; String ; ; ; ; ; 口令
PasswordAge ; ; ; ; ;String ; ; ; ; ; 距离口令最近修改时间
Privilege ; ; ; Long ; ; 用户级别0-来访客人1-一般用户;2-管理员
Flags ; ; ; ; ; ; ; Long ; ; ; ; ; 帐号标志
NoChangePwd ; ; ; Boolean ; ; ;是否允许用户更改口令
NoExpirePwd ; ; ; Boolean ; ; ; ; 口令是否过期
PasswordExpired ; ; ; Boolean ; ; ; ; 口令过期时间
AccDisabled ; ; ; Boolean ; ; ; ; 帐号是否禁用
AccLocked ; ; ; Boolean ; ; ; ; 帐号是否锁定
AcctExpires ; ; ; Date ;帐号是否过期:
如果为空,则永久有效;如果为日期,则为过期时间。
BadPwCount ; ; ; Long ; ; ; ;登录错误口令次数
ScriptPath ; ; ; String ; ; ; ; 启动脚本路径
AuthFlags ; ; ; Long ; ; ; ; ; 权限标识
UserComment ; ; ; String ; ; ; ; ; 用户描述
Parms ; ; ; ; ; ; ; String
Workstations ; ; ; String ; ; ; ; ;登录工作站
LastLogon ; ; ; Date ; ; ; ; 最后登站时间
LastLogoff ; ; ; Date ; ; ; ; 最后注销时间
MaxStorage ; ; ; Long
UnitsPerWeek ; ; ; Long
LogonHours ; ; ; Byte ; ; ; ;用户登录小时数
NumLogons ; ; ; Long
LogonServer ; ; ; String
CountryCode ; ; ; Long
CodePage ; ; ; Long
PrimaryGroupID ; ; ; Long ; ; ; ; ; ; 属组
Profile ; ; ; ; String ; ; ; ; ; 配置文件
HomeDir ; ; ; ; ; String ; ; ; ; ; ;主目录
HomeDirDrive ; ; ; String ; ; ; 主目录所在驱动器
; ;

---- 3. NT网域用户帐号远程管理系统的体系结构
---- 远程管理NT网域用户帐号的分层次体系结构如图2所示,该系统分为两个部分,一个是客户端用户管理接口程序,另一个是服务器端的代理程序。客户端用户接口程序主要是为网络远程管理提供的接口界面,管理员通过此界面输入参数及指令,接口程序将输入的参数及指令通过TCP层传送给服务器,服务器TCP层将参数及指令上传代理程序,最后由代理程序根据接收的指令来维护NT网域用户帐号(如图3)

;

---- NT帐号远程管理系统体系结构的另一个重要内容就是应用协议的编制。此系统应用协议笔者称之为远程帐号管理协议RAMP(Remote Account Management Protocol),RAMP协议数据单元主要包括两个字段:控制信息和数据信息。

控制信息(3B) 数 ;据 ;信 ;息(可变长度)
RAMP协议数据单元结构
控制信息字段占3B,如表2所示:
; ; ; ; ; ;RAMP控制信息
; ; ; 功能 控制信息字段
; ; ; 添加帐号 ADD
; ; ; 帐号信息 ACT
; ; ; 删除帐号 DEL
; ; ; 修改帐号 MDF
; ; ; 组 信 息 GRP
; ; ; 请 ; ;求 RQT
; ; ; 证 ; ;实 RSP
; ;
---- 在用户帐号管理中经常使用的帐号参数有Name、FullName、Comment、Password、NoChangePwd、NoExpirePwd、PasswordExpired 、AccDisabled、AccLocked、AcctExpires、Privilege、PrimaryGroupID等12个,所以RAMP协议数据单元数据信息字段设计为:
---- 1) 当控制信息为"ADD"或"MDF"时,

数据信息(623B)=Name(20B)+FullName(256B)
+Comment(256B)+Password(10B)+
NoChangePwd(5B)+NoExpirePwd(5B)+AccDisabled(5B)+
AccLocked(5B)+AcctExpires(20B)+Privilege(1B)+
PrimaryGroupID(20)+ PasswordExpired(20B)。

---- 2) 当控制信息为"ACT"时,若NT服务器中的用户帐号信息尚未发送完,则数据信息同1);否则数据信息为"END",告诉客户端帐号信息已全部发出。
---- 3) 当控制信息为"DEL"时,数据信息(20B)=Name(20B)。

---- 4) 当控制信息为"GRP"时,若NT服务器中的组帐号信息尚未发送完,则数据信息(20B)=组名;否则数据信息为"END",告诉客户端组信息已全部发出。

---- 5) 当控制信息为"RSP"时,数据信息(6B)=控制信息(3B)+证实信息(2B) 当执行成功时,证实信息="OK";否则为"NO"。

---- 6)当控制信息为"RQT"时,数据信息为"ACT",表示向服务器请求帐号信息;若为"GRP",表示向服务器请求组信息。

----4. 主机间会话控制

---- 本系统使用VB中的WinSock控件,以实现客户机(C)与NT服务器(S)的连接。在S端创建WinSock控件SvrWsk,使用程序1打开服务端口。

; ;程序1 ; ;打开服务端口
; ;SvrWsk.Protocol=sckTCPProtocol ;'使用TCP/IP协议
; ;SvrWsk.RemotePort=0 ; ; ; ; ; ;
; ;SvrWsk.LocalPort=2000 ; ; ; ; ; '设定服务端口2000
; ;SvrWsk.Listen ; ; ; ; ; ; ; ; ; '打开服务端口


---- 在C端创建WinSock控件CltWsk,用程序2与服务器端建立连接。
; ;程序2 ; ;与服务端口连接
; ;CltWsk.Protocol=sckTCPProtocol ;'使用TCP/IP协议
; ;CltWsk.RemotePort=2000 ; ; ; ; ;'设定远程服务端口
; ;CltWsk.RemoteHost="xxxxxxx" ; ; '设定服务器主机名或IP地址
; ;CltWsk.Connect ; ; ; ; ; ; ; ; ;'建立连接

---- 在连接建立以后,管理员在C端就可以远程维护S上的用户帐户。当C要修改S上用户帐号信息时(主机会话过程如图5所示),C首先向S发出请求"RQTACT",S收到请求后,向C发"ACT"数据。C收到"ACT"包,读取数据字段信息,若不是"END",上交应用程序;若是"END",数据不上交应用程序,接着向S发出"RQTGRP"请求。S接到请求后,向C发送NT网域组帐号信息,C依照接收"ACT"数据,来接收"GRP"数据。在接收完用户帐号信息和组帐号信息后,C应用程序显示用户帐号信息(如图6)。管理员在C上修改参数,然后将修改过的用户帐号信息加上"MDF"控制信息发送S,S收到"MDF"数据后,读取数据信息提交给代理程序,由代理程序负责修改用户帐号。S在正确修改用户帐号信息后,向C发"RSPMDFOK",表明修改成功,否则发"RSPMDFNO ",表明未正确修改。
;

;

---- 5. 服务器代理程序

---- 在服务器上主要使用了IADsUser对象来完成代理任务的。IADsUser对象的属性数据中包括了所有的NT网域用户帐号属性,如图7所示。

Name ; ; ; ; ; ; ; ; ; 用户名称
; ; Description ; ; ; ; ; ;帐号描述
; ; FullName ; ; ; ; ; ; ; 用户全称
; ; AccountDisabled ; ; ; ;帐号是否禁用
; ; AccountExpirationDate ;帐号期限
; ; IsAccountLocked ; ; ; ;帐号是否被锁定
; ; PasswordExpirationDate 口令期限
; ; Groups ; ; ; ; ; ; ; ; 用户所在组
; ; ChangePassword ; ; ; ; 帐号口令是否能被用户修改
; ; ; ; ; ; ; ; ; ; ; … ; …

---- 图7 IADsUser 对象部分属性
---- IADsUser对象中还设计了一些对象方法,程序员可以很方便地使用这些方法对用户帐号属性进行读、写、删除等操作。

---- 1)读取用户帐号"Administrator"信息的程序3:

程序3 ;读取"Administrator"帐号信息
; ; Dim usr As IADsUser ; ; ; ;'定义用户对象变量
; ; Dim cont As IADsContainer ; '定义容器对象变量
; ; Set cont = GetObject("WinNT://" & NTDomain) ;
; ; ; ; ;'连接NT网域,NTDomain用户可自定义
; ; Set usr = cont.GetObject("user", "Administrator")
; ; ; ; ;'读取Administrator帐号信息

; ; 2)新建一用户帐号"NewUser"程序4:
; ; ; ; ; ; ; 程序4 ; 新建"NewUser"
; ; Dim usr As IADsUser ; ; ; ;'定义用户对象变量
; ; Dim cont As IADsContainer ;'定义容器对象变量
; ; Set cont = GetObject("WinNT://" & NTDomain) ;
; ; ; ; ;'连接NT网域,NTDomain用户可自定义
; ; Set usr = cont.Create("user", "NewUser")
; ; ; ; ;'建立用户"NewUser"
; ; usr.FullName="XXXXXXXXX"
; ; usr.Description="XXXXXXXXXXX"
; ; usr.Put "PasswordExpired",Clng(0)
; ; ; ; ;'设置口令是否过期,0为过期;1-为不过期
; ; usr.AccountExpirationDate = CDate("01/01/1981")
; ; ; ; ;'设置帐号过期时间
; ; ; ; ; ;… … ;'设置其他属性
; ; ; ; ; ;usr.SetInfo ; '写入SAM

; ; 3)删除用户"NewUser"程序5:
; ; ; ; ;程序5 ;删除用户"NewUser"
; ; Dim usr As IADsUser ; ; ; ;'定义用户对象变量
; ; Dim cont As IADsContainer ; '定义容器对象变量
; ; Set cont = GetObject("WinNT://" & NTDomain) ;
; ; ; ; ;'连接NT网域,NTDomain用户可自定义
; ; Set usr = cont.Delete("user", "NewUser")
; ; ; ; ;'删除用户"NewUser"

---- 如果要修改一个用户帐号信息,要先读取帐号信息,然后再重新设置各属性,最后写入SAM即可,这里不再赘述。当服务器端代理程序执行成功后,即向客户机端发送"OK"表明执行完毕。
 
哇,好东西,收藏!
 
TO 夜黑风高:
; ;真是好东西,大侠真是高人,小的佩服。50分敬上。
 
接受答案了.
 
后退
顶部