如何使用 Powershell 将指定的 “计算机 或者 用户” 添加到指定 Organizational units(OU)的安全属性中,并赋予相应的权限
如下图,我需要将 Cluster01 的计算机添加到 SQL Server OU 的安全属性中,然后赋予完全的控制权限
附上我的解决发方法
# 定义登入活动目录(DC)控制器 ####################################################################################################### $DirectoryController = "DC01" # 定义:Domain controller 活动目录控制器的名称或者IP地址 $Password = "Admin@123" # 定义:登入 “活动目录控制器” 的密码 $DFN = [System.Net.DNS]::GetHostByName('') | ForEach-Object {($_.HostName -split "[.]")[-2]} # 定义:DnsForestName 域名的名称 $DomainManageUser = "$DFN\Administrator" # 定义:Domain controller 活动目录控制器的管理员 ############################################################################################################################## $DomainUserPassword = "$Password" | ConvertTo-SecureString -asPlainText -Force # 定义:Domain controller 活动目录控制器的管理员的密码 $UserPassword = New-Object System.Management.Automation.PSCredential($DomainManageUser,$DomainUserPassword) # 定义:Powershell 远程登入验证凭据 $PSSession = New-PSSession -ComputerName $DirectoryController -Credential $UserPassword # 定义:会话变量。创建 Powershell 的持久回话连接 # 1.设置活动目录中组织单位的访问规则 Invoke-Command -Session $PSSession -ScriptBlock { # 调用命令,指定会话变量 Import-Module ActiveDirectory # 导入 Domain controller 活动目录模块 cd AD: # 进入 活动目录 目录 if ( $? -eq $true ){ $DN = (Get-ADComputer -Identity "SQL01").DistinguishedName.Remove(0,9) # 定义:指定SQL01计算机的 DistinguishedName (专有OU(路径))名称,并删除 CN 中的9个字符 $SID = (Get-ADComputer -Filter 'name -like "*Cluster*"').SID # 定义:获取计算机名称包含 “Cluster” 的计算机的 SID $Acl = Get-Acl -Path "AD:$DN" # 定义:获取获取 $DN 的ACL $Ace = New-Object DirectoryServices.ActiveDirectoryAccessRule $sid, # 定义:新建对象,活动目录访问规则,并将 Access 访问规则设置为 “完全控制” 'GenericAll', 'Allow', '00000000-0000-0000-0000-000000000000', 'All', '00000000-0000-0000-0000-000000000000' $Acl.SetAccessRuleProtection($true, $true) $Acl.AddAccessRule($Ace) Set-Acl -Path "AD:$DN" -AclObject $Acl } } # 2. 获取指定 OU 设置后的,访问规则并重定向回本地的指定路径 # 再次引用,获取将制定计算机添加到指定的 OU 单元中的 Access 规则中,然后将获取的结果重定向到本机计算机的指定路径中 Invoke-Command -Session $PSSession -ScriptBlock { (Get-Acl -Path "AD:$DN").access | ft -AutoSize IdentityReference,ActiveDirectoryRights,InheritanceType,ObjectTypeInheritedObjectType,ObjectFlags,AccessControlType,IsInherited,InheritanceFlags,PropagationFlags } > "C:\DN.Access.log"
手上暂时没有Windows电脑,这个可以参考:
$path = "AD:\CN=Tester1,OU=Ou1,OU=OU2,OU=OU3,DC=Contoso,DC=com"
$acl = Get-Acl -Path $path
$ace = New-Object Security.AccessControl.ActiveDirectoryAccessRule('DOMAIN\Computername','FullControl')
$acl.AddAccessRule($ace)
Set-Acl -Path $path -AclObject $acl
嗯差不多,不过我是远程处理的
# 定义登入活动目录(DC)控制器 #######################################################################################################
$DirectoryController = “DC01” # 定义:Domain controller 活动目录控制器的名称或者IP地址
$Password = “Admin@123″ # 定义:登入 “活动目录控制器” 的密码
$DFN = [System.Net.DNS]::GetHostByName(”) | ForEach-Object {($_.HostName -split “[.]”)[-2]} # 定义:DnsForestName 域名的名称
$DomainManageUser = “$DFN\Administrator” # 定义:Domain controller 活动目录控制器的管理员
##############################################################################################################################
$DomainUserPassword = “$Password” | ConvertTo-SecureString -asPlainText -Force # 定义:Domain controller 活动目录控制器的管理员的密码
$UserPassword = New-Object System.Management.Automation.PSCredential($DomainManageUser,$DomainUserPassword) # 定义:Powershell 远程登入验证凭据
$PSSession = New-PSSession -ComputerName $DirectoryController -Credential $UserPassword # 定义:会话变量。创建 Powershell 的持久回话连接
# 1.设置活动目录中组织单位的访问规则
Invoke-Command -Session $PSSession -ScriptBlock { # 调用命令,指定会话变量
Import-Module ActiveDirectory # 导入 Domain controller 活动目录模块
cd AD: # 进入 活动目录 目录
if ( $? -eq $true ){
$DN = (Get-ADComputer -Identity “SQL01”).DistinguishedName.Remove(0,9) # 定义:指定SQL01计算机的 DistinguishedName (专有OU(路径))名称,并删除 CN 中的9个字符
$SID = (Get-ADComputer -Filter ‘name -like “*Cluster*”‘).SID # 定义:获取计算机名称包含 “Cluster” 的计算机的 SID
$Acl = Get-Acl -Path “AD:$DN” # 定义:获取获取 $DN 的ACL
$Ace = New-Object DirectoryServices.ActiveDirectoryAccessRule $sid, # 定义:新建对象,活动目录访问规则,并将 Access 访问规则设置为 “完全控制”
‘GenericAll’, ‘Allow’, ‘00000000-0000-0000-0000-000000000000’, ‘All’, ‘00000000-0000-0000-0000-000000000000’
$Acl.SetAccessRuleProtection($true, $true)
$Acl.AddAccessRule($Ace)
Set-Acl -Path “AD:$DN” -AclObject $Acl
}
}
# 2. 获取指定 OU 设置后的,访问规则并重定向回本地的指定路径
# 再次引用,获取将制定计算机添加到指定的 OU 单元中的 Access 规则中,然后将获取的结果重定向到本机计算机的指定路径中
Invoke-Command -Session $PSSession -ScriptBlock {
(Get-Acl -Path “AD:$DN”).access | ft -AutoSize IdentityReference,ActiveDirectoryRights,InheritanceType,ObjectTypeInheritedObjectType,ObjectFlags,AccessControlType,IsInherited,InheritanceFlags,PropagationFlags
} > “C:\DN.Access.log”