PowerShell 2.0 实践(九)管理活动目录(下)
2011-10-06 10:05
561 查看
上一次我们练习了批量创建域用户,以及对域用户进行一些查询、编辑操作。本次将主要对域组进行管理,其次是OU、组策略等高级话题。
测试脚本下载
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
1、查询域用户上一次登录域的时间:
#获取用户上一次登录域的时间
#DateTime.FromFileName --
摘自 MSDN
#A Windows file time is a 64-bit value that represents the number of 100-nanosecond
#intervals that have elapsed since 12:00 midnight, January 1, 1601 A.D. (C.E.)
#Coordinated Universal Time (UTC). Windows uses a file time to record when an application
#creates, accesses, or writes to a file.
Clear-Host
$t
=
Get-ADUser
-Identity "Administrator"
-Properties
lastlogon
[DateTime]::FromFileTime([Int64]::Parse($t["lastlogon"]))
运行结果:
域用户上一次登录域的时间存储在属性:lastlogon中,是一个长整形的数字,注释中是MSDN的官方解释,需要用DateTime.FromFileName方法进行转换。
2、
#检查用户密码过期情况,默认情况下密码的最大使用期限为42天
#通过检查pwdlastset属性来查询哪些用户的密码可能过期
Clear-Host
$now
= (Get-Date).ToFileTime()
$end
= ((Get-Date).Adddays(-200)).ToFileTime()
$dom
= [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root
= $dom.GetDirectoryEntry()
$filt
= "(&(objectcategory=Person)"
+ "(objectclass=user)"
+ "(pwdlastset>=$end)(pwdlastset<=$now))"
$search
= [System.DirectoryServices.DirectorySearcher]$root
$search.Filter
= $filt
$results
= $search.FindAll()
foreach ($result
in
$results){
$result.properties.distinguishedname
}
运行结果:
3、检查用户账户过期情况,如将一个域用户:User1的账户过期时间设置为10.2之后:
查询60内账户将到期的用户:
Clear-Host
$now
= (Get-Date).ToFileTime()
$end
= ((Get-Date).Adddays(60)).ToFileTime()
$dom
= [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root
= $dom.GetDirectoryEntry()
$filt
= "(&(objectcategory=Person)(objectclass=user)(accountexpires>=$now)(accountexpires<=$end))"
$search
= [System.DirectoryServices.DirectorySearcher]$root
$search.Filter
= $filt
$results
= $search.FindAll()
foreach ($result
in
$results){
$result.properties.distinguishedname
}
运行结果:
使用Microsoft或Quest的Cmdlets更加简洁:
Clear-Host
Search-ADAccount
-AccountExpiring
-TimeSpan
"60.00:00:00" –UsersOnly
Get-QADUser
-AccountExpiresBefore (Get-Date).AddDays(60)
运行结果:
Microsoft Cmdlets:
Quest Cmdlets:
4、创建域组
在Active Directory中组分为两类:安全组(Security)和通讯组(Distribution)。安全组是给共享资源指派权限的,通讯组没有安全方面的功能,基本只应用于电子邮件程序中。
组一般都有自己的作用域的,用来确定树或林中该组的应用范围。在Active Directory中有三种不同的组的作用域:通用,全局和本地域。相对应的就划分为三种不同的组即通用组,全局组和域本地组(在windows2003以前是没有通用作用域的,这里所介绍的是以windows server 2003为基础的)。
通用组(Universal):是一种集全局组和域本地组优点于一身的组,可以包含森林中任何的帐户,全局组和通用组,不能隶属于全局组,当只有在win2000本机模式或以上时才能被新建。
全局组(Global):可以在林中任意使用,体现的是全局性,也就是说可以利用全局组授予访问任何域上的资源的权限,但其成员只能是相同域的帐户和全局组(在win2000本机模式或以上),在混合模式时成员只能是相同域的帐户。
域本地组(DomainLocal):通常情况下用于授予在本域资源的访问权限,成员包含林中的帐户,全局组,通用组(在混合模式下没有通用组)。
如下,分别使用了Microsoft和Quest的Cmdlets创建了两个域组:
Clear-Host
New-ADGroup
-Name
"Developer" -Path
"OU=Temp,DC=Lucifer,DC=com"
-SamAccountName "开发部"
-GroupCategory
Security -GroupScope
Global
-Description "开发部"
-DisplayName
"开发部"
New-QADGroup
-Name
"Test" -Description
"测试部"
-SamAccountName
"测试部"
-GroupScope
Global -GroupType
Security
-ParentContainer "OU=Temp,DC=Lucifer,DC=com"
运行结果:
5、组中添加域用户
将User1添加进开发部:
Clear-Host
Get-ADUser
-Filter {Name
-eq "User1"}
-SearchBase
"OU=Domain Controllers,DC=Lucifer,DC=com" |
foreach {Add-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Members $($_.SamAccountName)}
将Domain Controllers中的用户添加进测试部:
Get-QADUser
-SearchRoot
"OU=Domain Controllers,DC=Lucifer,DC=com" |
foreach {Add-QADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Member $_.SamAccountName}
运行结果:
6、删除组成员
使用Microsoft Cmdlets时无法取消删除确认提示 - -!
Clear-Host
Remove-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Members "User1"
而Quest Cmdlets就非常人性化,无任何提示,方便批量删除:
Remove-QADGroupMember
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com"
-Member User2,User3
7、更改组的作用域,支持的方式:
# Universal to global
# Global to universal
# Domain local to universal
# Universal to domain local
注意通用组和全局组可以相互转换,域本地组和通用组可以相互转换,但是全局组和域本地组不能相互转换。
Clear-Host
Set-ADGroup
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-GroupScope Universal
-GroupCategory
Security
Set-QADGroup
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com"
-GroupScope Global
-GroupType
Distribution
运行结果:
8、查询组成员
Clear-Host
Get-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com" |
select Name
Get-QADGroupMember
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com" |
select Name
运行结果:
9、管理组策略
组策略(Group Policy)是管理员为用户和计算机定义并控制程序、网络资源及操作系统行为的主要工具。通过使用组策略可以设置各种软件、计算机和用户策略。
从Windows Server 2008 R2开始微软提供了组策略相关的PowerShell扩展,可以方便的自动化处理一些配置选项。
Windows Server 2008 R2
组策略新增功能:(摘自TechNet)
在 Windows Server® 2008 R2
和带有远程服务器管理工具 (RSAT)
的 Windows® 7
中提供以下更改:
组策略的 Windows PowerShell Cmdlet:能够从
Windows PowerShell(TM) 命令行管理组策略并且能够在登录和启动过程中运行 PowerShell
脚本
组策略首选项:其他类型的首选项
Starter
组策略对象:改进了 Starter GPO
管理模板设置:改进了用户界面和其他策略设置
这里有一篇文章详细介绍了此次更新,非常专业,建议阅读。
推荐一下微软的组策略官方博客。
注意,组策略的PowerShell脚本只能在Windows 7 、Windows Server 2008 R2上运行,其他操作系统即使安装了PowerShell V2也无法运行。
以Windows Server 2008 R2为例,首先要导入组策略的PowerShell模块:
Import-Module
GroupPolicy
查看此模块中包含哪些命令:
Get-Command
-Module
GroupPolicy | Get-Help |
Format-Table name,
synopsis
-AutoSize –Wrap
运行结果:
备份全部组策略:
New-Item
-Path
C:\GPBak -ItemType
Directory
-Force
Backup-GPO
-All
-Path C:\GPBak
-Comment
"Weekly Bak" -Server
BrooksPCNB.Lucifer.com
运行结果:
还原全部组策略:
Restore-GPO
-All
-Path C:\GPBak
-Server
BrooksPCNB.Lucifer.com
运行结果:
小结:
我用了三篇博文终于暂时结束了活动目录的测试,活动目录是一块很大的内容,短短三篇文章仅仅是走马观花,对常见的任务进行了测试,主要涉及域用户、域组的创建、修改、删除、查询。在PowerShell中主要有三种方法来管理活动目录:
1、.NET框架中的活动目录类
2、ADSI WinNT、LDAP Provider
3、Microsoft、Quest Cmdlets(推荐)
实际使用中建议使用第三种,因为其语法更加简洁,也是官方推荐的方式。
在测试脚本中使用了大量的LDAP查询,这种语法初次接触会相当不习惯,我就是如此,不过写的多了点就好多了,建议熟悉其基本操作,否则在活动目录管理中将寸步难行。在大多数管理任务中,域用户、域组的管理是使用最频繁也是最重要的操作之一,这也是本系列的重点。最后,我们对组策略进行了一次鸟瞰,这块的PowerShell扩展非常新,直到Windows Server 2008 R2才提供,后面我单独整理一篇文章出来测试一下组策略。活动目录告一段落之后,利用10.1假期我打算整理一下TFS 2010相关的管理操作,也熟悉一下TFS
2010的对象模型,再补充一篇《设计TFS 2010自定义流程》的文章,承接上次的《设计TFS 2008自定义流程》。
测试脚本下载
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
1、查询域用户上一次登录域的时间:
#获取用户上一次登录域的时间
#DateTime.FromFileName --
摘自 MSDN
#A Windows file time is a 64-bit value that represents the number of 100-nanosecond
#intervals that have elapsed since 12:00 midnight, January 1, 1601 A.D. (C.E.)
#Coordinated Universal Time (UTC). Windows uses a file time to record when an application
#creates, accesses, or writes to a file.
Clear-Host
$t
=
Get-ADUser
-Identity "Administrator"
-Properties
lastlogon
[DateTime]::FromFileTime([Int64]::Parse($t["lastlogon"]))
运行结果:
域用户上一次登录域的时间存储在属性:lastlogon中,是一个长整形的数字,注释中是MSDN的官方解释,需要用DateTime.FromFileName方法进行转换。
2、
#检查用户密码过期情况,默认情况下密码的最大使用期限为42天
#通过检查pwdlastset属性来查询哪些用户的密码可能过期
Clear-Host
$now
= (Get-Date).ToFileTime()
$end
= ((Get-Date).Adddays(-200)).ToFileTime()
$dom
= [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root
= $dom.GetDirectoryEntry()
$filt
= "(&(objectcategory=Person)"
+ "(objectclass=user)"
+ "(pwdlastset>=$end)(pwdlastset<=$now))"
$search
= [System.DirectoryServices.DirectorySearcher]$root
$search.Filter
= $filt
$results
= $search.FindAll()
foreach ($result
in
$results){
$result.properties.distinguishedname
}
运行结果:
3、检查用户账户过期情况,如将一个域用户:User1的账户过期时间设置为10.2之后:
查询60内账户将到期的用户:
Clear-Host
$now
= (Get-Date).ToFileTime()
$end
= ((Get-Date).Adddays(60)).ToFileTime()
$dom
= [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root
= $dom.GetDirectoryEntry()
$filt
= "(&(objectcategory=Person)(objectclass=user)(accountexpires>=$now)(accountexpires<=$end))"
$search
= [System.DirectoryServices.DirectorySearcher]$root
$search.Filter
= $filt
$results
= $search.FindAll()
foreach ($result
in
$results){
$result.properties.distinguishedname
}
运行结果:
使用Microsoft或Quest的Cmdlets更加简洁:
Clear-Host
Search-ADAccount
-AccountExpiring
-TimeSpan
"60.00:00:00" –UsersOnly
Get-QADUser
-AccountExpiresBefore (Get-Date).AddDays(60)
运行结果:
Microsoft Cmdlets:
Quest Cmdlets:
4、创建域组
在Active Directory中组分为两类:安全组(Security)和通讯组(Distribution)。安全组是给共享资源指派权限的,通讯组没有安全方面的功能,基本只应用于电子邮件程序中。
组一般都有自己的作用域的,用来确定树或林中该组的应用范围。在Active Directory中有三种不同的组的作用域:通用,全局和本地域。相对应的就划分为三种不同的组即通用组,全局组和域本地组(在windows2003以前是没有通用作用域的,这里所介绍的是以windows server 2003为基础的)。
通用组(Universal):是一种集全局组和域本地组优点于一身的组,可以包含森林中任何的帐户,全局组和通用组,不能隶属于全局组,当只有在win2000本机模式或以上时才能被新建。
全局组(Global):可以在林中任意使用,体现的是全局性,也就是说可以利用全局组授予访问任何域上的资源的权限,但其成员只能是相同域的帐户和全局组(在win2000本机模式或以上),在混合模式时成员只能是相同域的帐户。
域本地组(DomainLocal):通常情况下用于授予在本域资源的访问权限,成员包含林中的帐户,全局组,通用组(在混合模式下没有通用组)。
如下,分别使用了Microsoft和Quest的Cmdlets创建了两个域组:
Clear-Host
New-ADGroup
-Name
"Developer" -Path
"OU=Temp,DC=Lucifer,DC=com"
-SamAccountName "开发部"
-GroupCategory
Security -GroupScope
Global
-Description "开发部"
-DisplayName
"开发部"
New-QADGroup
-Name
"Test" -Description
"测试部"
-SamAccountName
"测试部"
-GroupScope
Global -GroupType
Security
-ParentContainer "OU=Temp,DC=Lucifer,DC=com"
运行结果:
5、组中添加域用户
将User1添加进开发部:
Clear-Host
Get-ADUser
-Filter {Name
-eq "User1"}
-SearchBase
"OU=Domain Controllers,DC=Lucifer,DC=com" |
foreach {Add-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Members $($_.SamAccountName)}
将Domain Controllers中的用户添加进测试部:
Get-QADUser
-SearchRoot
"OU=Domain Controllers,DC=Lucifer,DC=com" |
foreach {Add-QADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Member $_.SamAccountName}
运行结果:
6、删除组成员
使用Microsoft Cmdlets时无法取消删除确认提示 - -!
Clear-Host
Remove-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-Members "User1"
而Quest Cmdlets就非常人性化,无任何提示,方便批量删除:
Remove-QADGroupMember
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com"
-Member User2,User3
7、更改组的作用域,支持的方式:
# Universal to global
# Global to universal
# Domain local to universal
# Universal to domain local
注意通用组和全局组可以相互转换,域本地组和通用组可以相互转换,但是全局组和域本地组不能相互转换。
Clear-Host
Set-ADGroup
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com"
-GroupScope Universal
-GroupCategory
Security
Set-QADGroup
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com"
-GroupScope Global
-GroupType
Distribution
运行结果:
8、查询组成员
Clear-Host
Get-ADGroupMember
-Identity
"CN=Developer,OU=Temp,DC=Lucifer,DC=com" |
select Name
Get-QADGroupMember
-Identity
"CN=Test,OU=Temp,DC=Lucifer,DC=com" |
select Name
运行结果:
9、管理组策略
组策略(Group Policy)是管理员为用户和计算机定义并控制程序、网络资源及操作系统行为的主要工具。通过使用组策略可以设置各种软件、计算机和用户策略。
从Windows Server 2008 R2开始微软提供了组策略相关的PowerShell扩展,可以方便的自动化处理一些配置选项。
Windows Server 2008 R2
组策略新增功能:(摘自TechNet)
在 Windows Server® 2008 R2
和带有远程服务器管理工具 (RSAT)
的 Windows® 7
中提供以下更改:
组策略的 Windows PowerShell Cmdlet:能够从
Windows PowerShell(TM) 命令行管理组策略并且能够在登录和启动过程中运行 PowerShell
脚本
组策略首选项:其他类型的首选项
Starter
组策略对象:改进了 Starter GPO
管理模板设置:改进了用户界面和其他策略设置
这里有一篇文章详细介绍了此次更新,非常专业,建议阅读。
推荐一下微软的组策略官方博客。
注意,组策略的PowerShell脚本只能在Windows 7 、Windows Server 2008 R2上运行,其他操作系统即使安装了PowerShell V2也无法运行。
以Windows Server 2008 R2为例,首先要导入组策略的PowerShell模块:
Import-Module
GroupPolicy
查看此模块中包含哪些命令:
Get-Command
-Module
GroupPolicy | Get-Help |
Format-Table name,
synopsis
-AutoSize –Wrap
运行结果:
备份全部组策略:
New-Item
-Path
C:\GPBak -ItemType
Directory
-Force
Backup-GPO
-All
-Path C:\GPBak
-Comment
"Weekly Bak" -Server
BrooksPCNB.Lucifer.com
运行结果:
还原全部组策略:
Restore-GPO
-All
-Path C:\GPBak
-Server
BrooksPCNB.Lucifer.com
运行结果:
小结:
我用了三篇博文终于暂时结束了活动目录的测试,活动目录是一块很大的内容,短短三篇文章仅仅是走马观花,对常见的任务进行了测试,主要涉及域用户、域组的创建、修改、删除、查询。在PowerShell中主要有三种方法来管理活动目录:
1、.NET框架中的活动目录类
2、ADSI WinNT、LDAP Provider
3、Microsoft、Quest Cmdlets(推荐)
实际使用中建议使用第三种,因为其语法更加简洁,也是官方推荐的方式。
在测试脚本中使用了大量的LDAP查询,这种语法初次接触会相当不习惯,我就是如此,不过写的多了点就好多了,建议熟悉其基本操作,否则在活动目录管理中将寸步难行。在大多数管理任务中,域用户、域组的管理是使用最频繁也是最重要的操作之一,这也是本系列的重点。最后,我们对组策略进行了一次鸟瞰,这块的PowerShell扩展非常新,直到Windows Server 2008 R2才提供,后面我单独整理一篇文章出来测试一下组策略。活动目录告一段落之后,利用10.1假期我打算整理一下TFS 2010相关的管理操作,也熟悉一下TFS
2010的对象模型,再补充一篇《设计TFS 2010自定义流程》的文章,承接上次的《设计TFS 2008自定义流程》。
相关文章推荐
- 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活动目录管理实践 新书即将上市