代码改变世界

PowerShell2.0之桌面计算机维护(二)用户管理

2011-01-08 00:26  @天行健中国元素  阅读(2692)  评论(3编辑  收藏  举报

系统管理员的重要任务之一是管理用户,既允许用户做执行相应的操作,又要防止因权限设置不合理而潜在的用户越权操作。如在虚拟主机中设置的用户的主目录的权限有问题,其他用户可以采用..反溯到上级目录。进而访问其他用户的文件,直接造成这些文件的泄露,这个问题的解决方法是将每个用户的主目录权限设置为仅有管理员和用户本人可以访问,而拒绝其他人的访问。各用户的文件只是独立在自己的权限范围内,无法访问他人的文件,他人也无法访问自己的文件。

(1)创建本地用户

创建本地用户的方法通常使用net user和ADSI命令,也可以使用如图1所示的“新用户”对话框。

image

图1 “新用户”对话框

在cmd下可以直接使用net user命令创建用户。在PowerShell中使用ADSI方便而有效的创建本地用户和组,也可以使用WinNT ADSI Providernet user命令。本地账户没有域账户的多个属性,因而创建过程很简单。创建名为“CreateLocalUser.ps1”的脚本,其代码如下:

param($computer="localhost", $group, $help)

function funHelp()

{

$helpText=@"

DESCRIPTION:

NAME: CreateLocalGroup.ps1

Creates a local group on either a local or remote machine.

PARAMETERS:

-computer Specifies the name of the computer upon which to run the script

-group Name of group to create

-help prints help file

SYNTAX:

CreateLocalGroup.ps1

Generates an error. You must supply a group name

CreateLocalGroup.ps1 -computer WebServer -group MyGroup

Creates a local group called MyGroup on a computer named WebServer

CreateLocalGroup.ps1 -group Mygroup

Creates a local group called MyGroup on local computer

CreateLocalGroup.ps1 -help ?

Displays the help topic for the script

"@

$helpText

exit

}

if($help){ "Obtaining help ..." ; funhelp }

if(!$group)

{

$(Throw 'A value for $group is required.

Try this: CreateLocalGroup.ps1 -help ?')

}

$OBJou = [ADSI]"WinNT://$computer"

$objUser = $objOU.Create("Group", $group)

$objUser.SetInfo()

$objUser.description = "Test Group"

$objUser.SetInfo()

其中首先使用param语句定义了4个参数,即-computer、-user、-password和-help,随后定义了funhelp函数输出帮助信息。如果$help变量存在,则显示一条信息提示正在获取帮助文件,然后调用funhelp函数。接下来检查输入内容中的-user和-password参数是否被赋值,如果值不存在,则直接调用throw语句产生错误信息,并停止执行后续代码。

在用户名和密码均存在的前提下,脚本调用[ADSI]类型约束连接到本地计算机的账户数据库,并使用Create()方法利用$user变量中提供的用户名创建账户。随后调用SetPasswod()方法设置密码,并调用SetInfo()方法将其写入数据库。最后设置Description属性,并再次调用SetInfo()。

需要强调的是这个脚本中使用的SetInfo()方法仅在Windows Vista和Windows 2008以后版本的WMI模型中才出现,在Windows XP下安装的PowerShell中执行则报错。使用这个脚本创建用户的方法如下:

.\CreateLocalUser.ps1 –computer localhost -user UserForTest -password Passw0rd#!

创建的用户能够在管理工具中看到。

(2)创建用户组

为了有效地控制访问本地资源(如共享文件夹、扫描仪或打印机),需要在Windows Vista或Windows 2008系统中创建本地用户组。这些本地用户组如图2所示。

image

图2 本地用户组

本地用户组同样使用工作组设置,与新建账户工具类似。计算机管理控制台中也提供了“新建组”对话框,如图3所示。

image

图3 “计算机管理”控制台中的“新建组”对话框

为了创建本地用户组,创建名为“CreateLocalGroup.ps1”的脚本,其代码如下:

param($computer="localhost", $group, $help)

function funHelp()

{

$helpText=@"

DESCRIPTION:

NAME: CreateLocalGroup.ps1

Creates a local group on either a local or remote machine.

PARAMETERS:

-computer Specifies the name of the computer upon which to run the script

-group Name of group to create

-help prints help file

SYNTAX:

CreateLocalGroup.ps1

Generates an error. You must supply a group name

CreateLocalGroup.ps1 -computer WebServer -group MyGroup

Creates a local group called MyGroup on a computer named WebServer

CreateLocalGroup.ps1 -group Mygroup

Creates a local group called MyGroup on local computer

CreateLocalGroup.ps1 -help ?

Displays the help topic for the script

"@

$helpText

exit

}

if($help){ "Obtaining help ..." ; funhelp }

if(!$group)

{

$(Throw 'A value for $group is required.

Try this: CreateLocalGroup.ps1 -help ?')

}

$OBJou = [ADSI]"WinNT://$computer"

$objUser = $objOU.Create("Group", $group)

$objUser.SetInfo()

$objUser.description = "Test Group"

$objUser.SetInfo()

其中首先使用param语句定义了3个参数,即-computer、-group及-help,并将-computer参数的默认值设置为localhost。然后定义funhelp函数输出帮助信息,当用户提供-help参数时将输出帮助信息。

在运行脚本时需要提供新建组的名称,如果未提供$group变量,则显示通过throw语句产生的错误信息。创建用户组不需要提供密码,使用该脚本创建用户组的方法如下:

.\CreateLocalGroup.ps1 -group NewGroups

创建的用户组在计算机管理控制台中的本地组信息中显示,该脚本也使用了仅适用于Windows Vista和Windows 2008以上系统的SetInfo()方法。

(3)禁用或启用用户账号

本地用户账号主要用于访问本地资源或本地服务的账号,系统管理员可以禁用或启用特定账户来控制账户的可用性。

创建名为“EnableDisableUser.ps1”的脚本禁用或启用特定账户的权限,其代码如下:

param($computer="localhost", $a, $user, $password, $help)

function funHelp()

{

$helpText=@"

DESCRIPTION:

NAME: EnableDisableUser.ps1

Enables or Disables a local user on either a local or remote machine.

PARAMETERS:

-computer Specifies the name of the computer upon which to run the script

-a(ction) Action to perform < e(nable) d(isable) >

-user Name of user to modify

-help prints help file

SYNTAX:

EnableDisableUser.ps1

Generates an error. You must supply a user name

EnableDisableUser.ps1 -computer WebServer -user myUser

-password Passw0rd^&! -a e

Enables a local user called myUser on a computer named WebServer

with a password of Passw0rd^&!

EnableDisableUser.ps1 -user myUser -a d

Disables a local user called myUser on the local machine

EnableDisableUser.ps1 -help ?

Displays the help topic for the script

"@

$helpText

exit

}

$EnableUser = 512 # ADS_USER_FLAG_ENUM enumeration value from SDK

$DisableUser = 2 # ADS_USER_FLAG_ENUM enumeration value from SDK

if($help){ "Obtaining help ..." ; funhelp }

if(!$user)

{

$(Throw 'A value for $user is required.

Try this: EnableDisableUser.ps1 -help ?')

}

$ObjUser = [ADSI]"WinNT://$computer/$user"

switch($a)

{

"e" {

if(!$password)

{

$(Throw 'a value for $password is required.

Try this: EnableDisableUser.ps1 -help ?')

}

$objUser.setpassword($password)

$objUser.description = "Enabled Account"

$objUser.userflags = $EnableUser

$objUser.setinfo()

}

"d" {

$objUser.description = "Disabled Account"

$objUser.userflags = $DisableUser

$objUser.setinfo()

}

DEFAULT

{

"You must supply a value for the action.

Try this: EnableDisableUser.ps1 -help ?"

}

}

使用该脚本可以启用或禁用特定账户,并更改特定账号的密码。在脚本中首先使用param语句定义了5个参数,其中-compute指定执行该脚本的主机,默认为本机localhost;-a指定运行脚本执行的操作;-user和-password指定密码;-help调用funhelp函数显示帮助的内容。在funhelp函数之后声明了两个变量,其中包括ADS_USER_FLAG_ENUM枚举值,相关具体的内容可以参考Windows SDK,这些值可以用于启动或禁用用户账号。

需要强调的是虽然ADS_USER_FLAG_ENUM枚举值在Windows SDK中有详细说明,但是并没有介绍在PowerShell中的使用。由于无法获得PowerShell中IadsUser的直接支持,所以在VBScript中用于禁用账户的AccountDisabled布尔属性在PowerShell中无法继续使用。这样之前用于禁用账户的VBScript脚本不能移植到PowerShell中,而EnableDisableUser.ps1脚本并不能由VBScript转换而来。

定义这两个变量后需要测试help参数以确定是否显示帮助信息,在这个脚本中必须输入参数-user,即禁用或启用的用户名。如果该参数为空,系统将会抛出错误并停止后续语句的执行。检测到用户名后,使用[ADSI]类型约束符及WinNT Active Directory服务接口(ADSI)Provider连接到本地计算机的SAM账户数据库并获取用户对象。

获取用户对象之后使用switch语句判断$a变量的值,该变量用于指定脚本中执行的相应操作。如果要启用账户,那么需要为该账户设置密码,即为参数-a提供e(enable,启用)值。当-password参数未接收到密码时抛出异常提示用户查看帮助信息。如果密码存在,则调用SetPasswod方法为用户设置密码。并将用户Description(描述)属性修改为“Enable Account”,使用UserFlags属性值启用账户,最后调用SetInfo()方法将更改提交到SAM账户数据库。启用账户操作命令的标准格式如下:

.\EnableDisableUser.ps1 -user UserForTest -password Passw0rd#! -a e

要禁用账户,为参数-a传递d(disable,禁用)值。并为UserFlags参数设置适当值,调用SetInfo()方法将更改提交给SAM账户数据库。在这里为了使演示效果更为明显,在调用SetInfo()方法之前将用户的Description(描述)属性改为disable Account。禁用账户操作命令的标准格式如下:

.\EnableDisableUser.ps1 -user UserForTest -a d

如果用户未指定-a的参数为e或d,则脚本执行默认操作,在本例中会输出字符串提示用户查看帮助文件。启用或禁用用户的执行结果如图4所示。

image

图4 执行结果

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.lzuer.com/