PowerShell 2.0 实践(七)管理活动目录(上)
2011-10-06 10:04
465 查看
上一次我们对Windows日志进行了深入的研究与测试,重在设置不同的条件来查询我们感兴趣的日志,精确的条件可以快速找到问题的症状,方便管理员及时排错。本次我们来重点关注一下Windows Server,以Windows Server 2008 R2 DataCenter为例,对活动目录进行一些测试。对于活动目录,计划写三篇博文:上中下,本次为第一篇,主要来测试域用户的编辑等。
测试脚本下载
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
活动目录(Active Directory)是Windows操作系统下的一种企业资源解决方案。其体系结构如下:
在Windows Server 2008 R2上安装了活动目录角色后,会有如下一些管理工具:
Active Directory Administrator Center是一个很有用的工具:
界面全部用WPF设计:
管理用户账户
对于活动目录来说,用户、组的管理是一个核心内容。在PowerShell 2.0中,可以使用如下方法管理用户、组:
ADSI(Active Directory Service Interfaces,活动目录服务接口):WinNT Provider、LDAP Provider
System.DirectoryServices
System.DirectoryServices.AccountManagement
Microsoft Active Directory Cmdlets(微软提供的PowerShell扩展)
Quest Active Directory Comlets(Quest公司提供的PowerShell扩展)
在创建域用户、域组之前,先创建一些本地用户和组。
2、使用.NET类创建一个本地用户:
#创建一个本地用户
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
#PowerShell 2.0中还可以这样添加程序集
#Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$password
=
Read-Host "Password"
-AsSecureString
#作为密码
$cred
=
New-Object
-TypeName System.Management.Automation.PSCredential
-ArgumentList
"userid", $password
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
#本地用户
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
#替换为你自己的机器名
$usr
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.UserPrincipal
-ArgumentList
$context
$usr.SamAccountName
= "Newuser1"
$usr.SetPassword($cred.GetNetworkCredential().Password)
$usr.DisplayName
= "New User"
$usr.Enabled
= $true
$usr.ExpirePasswordNow()
#下次登录时必须修改密码
$usr.Save()
首先会提示输入待创建用户的密码,注意密码强度要符合策略,运行结果:
3、创建本地组:
#创建一个本地组
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
$gtype
= [System.DirectoryServices.AccountManagement.GroupScope]::Local
$grp
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.GroupPrincipal
-ArgumentList
$context, "Group1"
$grp.IsSecurityGroup
= $true
$grp.GroupScope
= $gtype
$grp.Save()
运行结果:
4、将用户添加进组:
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
$idtype
= [System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName
$grp
= [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context,
$idtype,
"Group1")
$grp.Members.Add($context,
$idtype,
"Newuser1")
$grp.Save()
运行结果:
5、使用Microsoft Active Directory Cmdlets创建域用户:
New-ADUser
-Name
"Brooks" -SamAccountName
"Brooks"
`
-GivenName
"Brooks"
-Surname "Brooks"
`
-Path
"OU=Domain Controllers,DC=Lucifer,DC=com"
-DisplayName
"Mr.Brooks"
`
-AccountPassword (Read-Host
-AsSecureString
"AccountPassword") -CannotChangePassword
$false
`
-ChangePasswordAtLogon
$true
-UserPrincipalName Brooks@Brooks.com
运行结果:
6、使用Quest Active Directory Cmdlets创建域用户:
若你还没有添加Snapin,则需要先添加:
Add-PSSnapin
Quest.ActiveRoles.ADManagement
New-QADUser
-Name
"Brooks" -FirstName
"Mr"
-LastName "Brooks"
`
-DisplayName
"Brooks"
-SamAccountName "Brooks"
`
-UserPassword (Read-Host
-AsSecureString)
-UserPrincipalName
"Brooks@Lucifer.org" `
-ParentContainer
"OU=Domain Controllers,DC=Lucifer,DC=com"
运行结果:
7、关于ADSI适配器的WinNT和LDAP Provider,其语法我不太熟悉,故不再举例,感兴趣的朋友可以查查相关资料。
不过ADSI有个注意点,ADSI适配器直接操作本地SAM(Security Accounts Manage,安全账户管理器数据库),其位于:%windir%\System32\config目录,包括两个文件 SAM、SECURITY:
SAM本地数据库存储了如下重要信息:
用户账户信息
组信息
计算机账户信息(仅适用于WindowsNT、Workstation)
受信任的账户关联
同时SAM本地数据库是注册表的一部分,其位于如下分支:
HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\SECURITY
SAM本地数据库不能直接编辑,进入操作系统后即被锁定。可以通过第三方工具如saminside进行破解,注意,仅限于找回丢失的密码,不要尝试盗取别人密码等操作。
小结:
本次我们练习了使用.NET框架中的类以及微软与Quest的PowerShell扩展来创建域用户、组,部署时需要注意System.DirectoryServices
System.DirectoryServices.AccountManagement
需要.NET Framework 3.5或更新版本。
通过微软和Quest的PowerShell扩展可以很简洁的创建域用户、组,推荐使用这两种命令,要确保密码强度符合组策略。最后我们熟悉了下SAM数据库,SAM存储了很多用户账户信息,非常重要,理解SAM数据库可以更好地理解Active Directory体系结构。下一次我们将练习批量创建域用户、组,以及其他一些更高级的操作。
测试脚本下载
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
活动目录(Active Directory)是Windows操作系统下的一种企业资源解决方案。其体系结构如下:
在Windows Server 2008 R2上安装了活动目录角色后,会有如下一些管理工具:
Active Directory Administrator Center是一个很有用的工具:
界面全部用WPF设计:
管理用户账户
对于活动目录来说,用户、组的管理是一个核心内容。在PowerShell 2.0中,可以使用如下方法管理用户、组:
ADSI(Active Directory Service Interfaces,活动目录服务接口):WinNT Provider、LDAP Provider
System.DirectoryServices
System.DirectoryServices.AccountManagement
Microsoft Active Directory Cmdlets(微软提供的PowerShell扩展)
Quest Active Directory Comlets(Quest公司提供的PowerShell扩展)
在创建域用户、域组之前,先创建一些本地用户和组。
2、使用.NET类创建一个本地用户:
#创建一个本地用户
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
#PowerShell 2.0中还可以这样添加程序集
#Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$password
=
Read-Host "Password"
-AsSecureString
#作为密码
$cred
=
New-Object
-TypeName System.Management.Automation.PSCredential
-ArgumentList
"userid", $password
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
#本地用户
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
#替换为你自己的机器名
$usr
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.UserPrincipal
-ArgumentList
$context
$usr.SamAccountName
= "Newuser1"
$usr.SetPassword($cred.GetNetworkCredential().Password)
$usr.DisplayName
= "New User"
$usr.Enabled
= $true
$usr.ExpirePasswordNow()
#下次登录时必须修改密码
$usr.Save()
首先会提示输入待创建用户的密码,注意密码强度要符合策略,运行结果:
3、创建本地组:
#创建一个本地组
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
$gtype
= [System.DirectoryServices.AccountManagement.GroupScope]::Local
$grp
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.GroupPrincipal
-ArgumentList
$context, "Group1"
$grp.IsSecurityGroup
= $true
$grp.GroupScope
= $gtype
$grp.Save()
运行结果:
4、将用户添加进组:
Clear-Host
[void][reflection.assembly]::Load("System.DirectoryServices.AccountManagement,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$ctype
= [System.DirectoryServices.AccountManagement.ContextType]::Machine
$context
=
New-Object
-TypeName System.DirectoryServices.AccountManagement.PrincipalContext
-ArgumentList
$ctype, "BrooksPCNB"
$idtype
= [System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName
$grp
= [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context,
$idtype,
"Group1")
$grp.Members.Add($context,
$idtype,
"Newuser1")
$grp.Save()
运行结果:
5、使用Microsoft Active Directory Cmdlets创建域用户:
New-ADUser
-Name
"Brooks" -SamAccountName
"Brooks"
`
-GivenName
"Brooks"
-Surname "Brooks"
`
-Path
"OU=Domain Controllers,DC=Lucifer,DC=com"
-DisplayName
"Mr.Brooks"
`
-AccountPassword (Read-Host
-AsSecureString
"AccountPassword") -CannotChangePassword
$false
`
-ChangePasswordAtLogon
$true
-UserPrincipalName Brooks@Brooks.com
运行结果:
6、使用Quest Active Directory Cmdlets创建域用户:
若你还没有添加Snapin,则需要先添加:
Add-PSSnapin
Quest.ActiveRoles.ADManagement
New-QADUser
-Name
"Brooks" -FirstName
"Mr"
-LastName "Brooks"
`
-DisplayName
"Brooks"
-SamAccountName "Brooks"
`
-UserPassword (Read-Host
-AsSecureString)
-UserPrincipalName
"Brooks@Lucifer.org" `
-ParentContainer
"OU=Domain Controllers,DC=Lucifer,DC=com"
运行结果:
7、关于ADSI适配器的WinNT和LDAP Provider,其语法我不太熟悉,故不再举例,感兴趣的朋友可以查查相关资料。
不过ADSI有个注意点,ADSI适配器直接操作本地SAM(Security Accounts Manage,安全账户管理器数据库),其位于:%windir%\System32\config目录,包括两个文件 SAM、SECURITY:
SAM本地数据库存储了如下重要信息:
用户账户信息
组信息
计算机账户信息(仅适用于WindowsNT、Workstation)
受信任的账户关联
同时SAM本地数据库是注册表的一部分,其位于如下分支:
HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\SECURITY
SAM本地数据库不能直接编辑,进入操作系统后即被锁定。可以通过第三方工具如saminside进行破解,注意,仅限于找回丢失的密码,不要尝试盗取别人密码等操作。
小结:
本次我们练习了使用.NET框架中的类以及微软与Quest的PowerShell扩展来创建域用户、组,部署时需要注意System.DirectoryServices
System.DirectoryServices.AccountManagement
需要.NET Framework 3.5或更新版本。
通过微软和Quest的PowerShell扩展可以很简洁的创建域用户、组,推荐使用这两种命令,要确保密码强度符合组策略。最后我们熟悉了下SAM数据库,SAM存储了很多用户账户信息,非常重要,理解SAM数据库可以更好地理解Active Directory体系结构。下一次我们将练习批量创建域用户、组,以及其他一些更高级的操作。
相关文章推荐
- PowerShell 2.0 实践(七)管理活动目录(上)
- PowerShell 2.0 实践(九)管理活动目录(下)
- PowerShell 2.0 实践(八)管理活动目录(中)
- PowerShell 2.0 实践(九)管理活动目录(下)
- PowerShell 2.0 实践(八)管理活动目录(中)
- PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)
- 新书《Windows Server 2012活动目录管理实践》上市
- 《Windows Server 2012活动目录管理实践》 内容提要、前言
- PowerShell 2.0 实践(四)管理Windows进程
- PowerShell 2.0 实践(五)管理Windows注册表
- 《Windows Server 2012活动目录管理实践》 目录 1-14章
- PowerShell 2.0 实践(五)管理Windows注册表
- 《Windows Server 2012活动目录管理实践》 目录15-28章
- PowerShell 2.0 实践(六)管理Windows日志
- PowerShell 2.0 实践(四)管理Windows进程
- PowerShell 2.0 实践(六)管理Windows日志
- PowerShell 2.0 实践(十一)管理 TFS 2010 (2)
- PowerShell 2.0 实践(十一)管理 TFS 2010 (2)
- PowerShell 2.0 实践(五)管理Windows注册表
- Windows Server 2012活动目录管理实践 新书即将上市