極æ±ã«ç¹åšããããŸããŸãªéœåžã®11ã®éæ¥ç¶ãããã¯ãŒã¯ã«ãã11ã®ç¡é¢ä¿ãªãã¡ã€ã³ã ãŸãããã»ãã³ããããã€ã¹ããããååšããªããšããäºå®ã¯ãããŸãããããã«ããã ADã³ãã³ãã¬ããã2000ããã³3ãšçµã¿åãããŠäœ¿çšããããšããè©Šã¿ãçµäºããŸãã
ã¿ã¹ã¯ã¯æ¬¡ã®ããã«å®åŒåãããŸãã-ãWindows XP / 2003ã§å®è¡ãããPowerShellã¹ã¯ãªããããåºæ¬çãªAD管çæäœãå®è¡ã§ããã³ãŒããäœæããŸããã ãããã©ã®ããã«è§£æ±ºãããããèªãã§ãhabrakatïŒ æ³šææ·±ããæŸèæ;å€ãã®ããã¹ããšã³ãŒã ïŒã®äžã§èªãã§ãã ããã
ã³ã³ããã¹ã
æè¿ãäžè¬çã«ãenikeyschikã®éå±ãªäœæ¥ã¯ãã·ã¹ãã 管çè ãä»ã®ITããŒãã®ç°åžžãªæŽ»åã®æéã«ãã£ãŠå¹Ÿåè€éã«ãªããŸããã圌ãã¯ããµãŒããŒãµãŒãã¹ããŠãŒã¶ãŒã¯ãŒã¯ã¹ããŒã·ã§ã³ãããã³ä»ã®ITãšã³ã¿ãŒãã©ã€ãºã®èšå®ã«å€ãã®å€æŽãå ããããšã決å®ããŸããã åœç¶ãenikeyshchikovã®æã«ãã£ãŠãtkã AltirisãMS SCCMãªã©ã®éåžžã®ããŒã«ã¯ãããŸããã§ããã
ããæç¹ã§ãç§ã«å§ãããããããã¯ãŒã¯ã§åœŒãã®ç¬åµçãªã¢ã€ãã¢ãå®çŸããæéããªãããšãç©ççã«èªèããèªååã«ã€ããŠèããŸããã åŽåæéã®åæã¯ããŸããADã®å€æŽã®è€è£œããã»ã¹ãå éããå¿ èŠãããããšã瀺ããŸããã ãã®ããã«ã¯ãActive Directory Comandletsãå¿ èŠã§ããããã«æããŸããïŒãã®äœæ¥ã®ããã«ãWindows 7ã®ã©ã€ã»ã³ã¹ãå°ãªããšã1ã€è³Œå ¥ããå¿ èŠããããŸããïŒã
ããžãã¹ãªãŒããŒãšã·ã¹ãã 管çè ã¯å®¹èµŠãããŸããã§ããããå€ãã·ã¹ãã ãæ£åžžã«æ©èœããã®ã«ããªãæ°ããã·ã¹ãã ãå¿ èŠãªã®ã§ããã ãããããŸããããªãã®ïŒ ãããããã¹ãŠãçŽ æŽããããã®ã«ããããã®ããªããããŸãïŒ ããã§ãªããã°ããªãããªãã¯ãããªã«æ¯æãããŸããïŒ ã¯ãããšããã§ãæ¬åœã«æ°ããã·ã¹ãã ãå¿ èŠãªå Žåã¯ãèªåã®ãéã§èªåã§è³Œå ¥ããŠäœ¿çšããŠãã ããïŒ ãããŠãäžè¬çã«ãææ¡ãããããŒã«ã®æ çµã¿å ã§ããžãã¹äžã®åé¡ã解決ã§ããªãå Žåã圌ã¯äŒç€Ÿãå»ããŸããïŒã
ãããããŸãããç§ã¯çããïŒãå€ã«åºãªããã æçµçã«ã管çã®ããŠã£ãã·ã¥ãªã¹ããã®å®è£ ã¯ãenikeyschikãšå®éã®ã·ã¹ãã 管çè ã®äž»ãªéãã®1ã€ã§ãã ããäžåºŠã工倫ãããŠããåºãŠè¡ããå¿ èŠãããããšãæããã«ãªããŸããã PowerShellã¯ããersatz-management AD ãã·ã¹ãã ãæ§ç¯ããããã®ãã©ãããã©ãŒã ãšããŠéžæãããŸããïŒäž»ã«.NETããã³COMãšã®äœæ¥ã容æã«ããããïŒã
ã³ãŒã
äžæã®ãŠãããåãååŸãã
ActiveDirectoryã䜿çšããããšãããå ŽåããŸãã¯å¥ã®LDAPå®è£ ã«ç²ŸéããŠããå Žåã¯ãäžæã®ïŒèå¥å¯èœãªïŒååãDNïŒ èå¥å ïŒã§ããããŸããŸãªã±ãŒã¹ã§ã©ãã ãåºã䜿çšãããŠããããç¥ã£ãŠããŸãã
äžæã®LDAPåã¯ãããã€ãã®çžå¯Ÿçãªäžæã®åå-RDNïŒ çžå¯Ÿèå¥å ïŒã§æ§æãããŸããããã¯ãå±æ§=å€ãã®ãã¢ã§ãã çµç¹åäœã®çžå¯Ÿçãªäžæã®ååã®äŸïŒ
ou=Managers
åããŠãããã®äžæã®ååã®äŸïŒ
ou=Managers,DC=example,dc=com
ãã®ãšã³ããªã¯ããexample.comããšããååã®ADãã¡ã€ã³ã®æåã®ã¬ãã«ã«ããããŒãžã£ãŒããŠããããããããšã瀺ããŠããŸãã
ç§èªèº«ã®çµéšãããäžæã®LDAPåã¯çŽæçã§ã¯ãªããåå¿è ã®enikeyschikovã«ããã€ãã®å°é£ãåŒãèµ·ãããŠãããšèšããŸãã ãããã£ãŠããexample.com/Managers/Accounting/ããšãã圢åŒã®çŽæçãªè¡šçŸãDNè¡šèšã«å€æããç°¡åãªé¢æ°ãèšè¿°ããå¿ èŠãããããšãããããŸããã
<# .SYNOPSIS OU "example.com/123/456", Distinguished Name. .Description , . : DNS-, NEIBIOS (.. example.com, EXAMPLE) .PARAMETER Path , DN .OUTPUTS System.String. Distinguished Name, . #> Function Convert-ADPath2DN([STRING]$Path) { $Res = "" $ResOU = $null # OU OU DN $P = Join-Path $Path "/" $P = $P.Replace("\","/") #, - if ($P -match "^(?<DNS_DOMAIN_NAME>(\w+\.\w+)+)\/.+$") { $i = 0 $DNS_DOMAIN_NAME = $Matches.DNS_DOMAIN_NAME # OU While (-not ($P -eq $DNS_DOMAIN_NAME)) { $i++ $OU = Split-Path -Leaf $P $P = Split-Path -Parent $P If ($i -ne 1) { $ResOU = $ResOU + "," } $ResOU = $ResOU+ "OU=$OU" } } else { $DNS_DOMAIN_NAME = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name } # , $DNS_DOMAIN_NAME = $DNS_DOMAIN_NAME.Replace(".","\") $DC_NAMES = @() While ($DNS_DOMAIN_NAME -ne "") { $DC = Split-Path -Leaf $DNS_DOMAIN_NAME $DNS_DOMAIN_NAME = Split-Path -parent $DNS_DOMAIN_NAME $DC_NAMES = $DC_NAMES + $DC } $Count = $DC_NAMES.Count for ($i=$Count;$i -gt 0;$i--) { $DC = $DC_NAMES[$i - 1] If ($i -ne $Count) { $ResDC = $ResDC + "," } $ResDC = $ResDC+ "DC=$DC" if ($ResOU -ne $null) { $Res = $ResOU + "," + $ResDC } else { $Res = $ResDC } } Return $Res }
䜿çšäŸïŒ
$Var = Convert-ADPath2DN -Path "example.com/Test/" $Var OU=Test,DC=example,DC=com
ãã®é¢æ°ã¯ActiveDirectoryã®ç®¡çã«çŽæ¥é¢ä¿ããŠããŸããããéåžžã«äŸ¿å©ã§ãããä»ã®é¢æ°ã§äœ¿çšãããŠããŸãã
çµç¹åäœã®çµç¹
åenikeyschikã¯ãç¹å¥ã«å²ãåœãŠããããã¹ããã¡ã€ã³ã§ActiveDirectoryã®ã¹ã¯ãªããããã¹ãããå¿ èŠãããããšãç¥ã£ãŠããå¿ èŠããããŸããã§ããã°ãäŒæ¥ã®ã¡ã€ã³ãããã¯ãŒã¯ããç©ççã«åæããŠãã ããã
åæ§ã«éèŠãªã®ã¯ãITã³ã¹ããåæžããããã®äŒç€Ÿã®ããªã·ãŒãžã®æºæ ã§ãïŒå€ãã®éäžæ žçµç¹ããã®ãããªæ瀺ãæã£ãŠãããšæããŸãïŒããã¹ãç°å¢ãå±éã§ããenikeyschikã«ã¯ååãšããŠãããŸããã
ãããã£ãŠãç§ãã¡ã®ããŒããŒã¯ãäžçŽã®åå¿ã®å³ããåœä»€ã«åããŠããæŠéãADã§åœŒã®ææãçŽæ¥ãã¹ãããŸãã ç§ãã¡ã¯ããã圌ã®ããã«ããŸãããã代ããã«å©ããããšããŸãã
圌ãæåã«ãã¹ãããšã¯ãå¥ã®çµç¹åäœãäœæããããšã§ãããã®äžã§ãã¹ã¯ãªããäœæã¹ãã«ã®ãããªãéçºãè¡ãããŸãã ããŠããããã¯ã®ãããã¯ã¯Powershellããã°ã©ãã³ã°ã«é¢é£ããŠãããããããã«å¯Ÿå¿ããé¢æ°ãå®è£ ããŸãã
ãããè¡ãã«ã¯ã System.DirectoryServices.DirectoryEntryã¯ã©ã¹ã®Create ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿ èŠããããŸãã æçµããŒãžã§ã³ã¯ãããšãã°æ¬¡ã®ããã«ãªããŸãã
<# .SYNOPSIS AD . .Description , . - . New-ADOrganizationUnit .PARAMETER Path AD, OU (.. ). .PARAMETER Name (Organization Unit). .OUTPUTS $null. . #> Function New-ADOrganizationUnit_simple([STRING]$Path,[STRING]$Name) { # , .. . # - OU, . $ErrorActionPreference = "SilentlyContinue" # DN (. ) $OUDN = Convert-ADPath2DN -Path $Path # ADsPath $OUDN = "LDAP://$OUDN" # , $objDomain = [ADSI]$OUDN # $objOU = $objDomain.Create("organizationalUnit", "ou=$Name") $objOU.SetInfo() # Trap { # , , . if ($_.Exception.ErrorCode -eq $SYSTEM_ERROR_CODE_OU_ALREADY_EXISTS) { Write-Host "OU $Name $Path " } } }
ãã®å®è£ ã®æãããªæ¬ ç¹ã¯ããã®é¢æ°ãå®å šãªãã©ã³ããã©ã³ããäœæã§ããªãããšã§ãããã©ã³ã " example.com/Users "ãæããªããã¡ã€ã³ã«OU " example.com/Users/HR/Women "ãäœæããå¿ èŠãããå Žåã䜿çšã§ããŸããã圌女ã¯ãã®åé¡ã解決ããŸãã
ããæ£ç¢ºã«ã¯ãã§ããŸãããããã¯éåžžã«äžäŸ¿ã§ãã æåã«OUããŠãŒã¶ãŒããäœæãã次ã«ãHRããäœæãããã®åŸã§ã女æ§ããäœæããå¿ èŠããããŸãã
ãã®ãããªã·ããªãªã¯ãã«ãŒãã³èªååã®ååãšæããã«ççŸãããããåãå ¥ããããŸããã 代ããã«ã次ã®ããã«ããã©ã³ãå šäœãèªåçã«äœæããé¢æ°ã䜿çšããããšããå§ãããŸãã
<# .SYNOPSIS AD . .Description , ( ). .PARAMETER Path . .OUTPUTS $null. . #> Function New-ADOrganizationUnit ([STRING]$Path) { #, (example.com/Unit1/Unit2...) If ($Path -match "^(?<DNS_DOMAIN_NAME>(\w+\.\w+)+)\/.+$") { $i = 0 # , "*-Path" $Pth = Join-Path $Path "/" $Pth = $Pth.Replace("\","/") $OUs = @() # OU While ($Pth -ne "") { $i++ $Pos = $Pth.IndexOf("/") If ($i -eq 1) { $DNS_DOMAIN_NAME = $Pth.Substring(0,$Pos) } else { $OU = $Pth.Substring(0,$Pos) $OUs = $OUs + $OU } $Pth = $Pth.Substring($Pos+1,($Pth.Length - $Pos -1)) } # OU $Pth = $DNS_DOMAIN_NAME For ($i=0;$i -lt $OUs.Count;$i++) { $OU = $OUs[$i] # OU. # " ", # - . New-ADOrganizationUnit_simple -Name $OU -Path $Pth $Pth = $Pth + "/" + $OU } } }
é¢æ°ã®äœ¿çšã¯ç°¡åã§ãïŒ
# "Test" "MyFirstOU" example.com New-ADOrganizationUnit -Path "example.com/Test/MyFirstOU/" | Out-Null
ã»ãã¥ãªãã£ã°ã«ãŒãã®è¿œå
æ¬ç©ã®æ¬ãèªãã çµéšè±å¯ãªã·ã¹ãã 管çè ã¯ãAD管çã·ããªãªã§ãç¹ã«ãã®æ§é ãèšç»ãããšãã«ïŒãã¡ãããããã¯ã³ãäžè¬ã«ãã®åé¡ã®è§£æ±ºãžã®åå ãèš±å¯ããŠããå ŽåïŒã ã»ãã¥ãªãã£ã°ã«ãŒããåäžãŠãŒã¶ãŒã¢ã«ãŠã³ããããããã¯ã³ãæšå¥šããããšããå§ãããŸãã
åŒæ°ã¯éåžžãçµæã®æ§é ã®è€è£œå¯èœæ§ã§ããããšãã°ããã£ã¬ã¯ã¿ãŒãå人çã«ïŒãŸãã¯åœŒã®ã¢ã«ãŠã³ãïŒä»»æã®ãœãããŠã§ã¢ãå®è¡ã§ããããã«ããã°ã«ãŒãããªã·ãŒã®èªã¿åããèš±å¯ããå Žåããã®ãããªæ©äŒãä»ã®èª°ãã«æäŸããå¿ èŠãçããå Žåããã¹ãŠã®æé ãå®è¡ããå¿ èŠããããŸãå¥ã®éèŠãªåç¶ã®ã¢ã¯ã»ã¹æš©ã®èšå®ãç¹°ãè¿ããŸãã
ã gAllowRunAnything ããªã©ã®ã°ã«ãŒããäœæãããã®ã°ã«ãŒãã®ã¡ã³ããŒã«ä»»æã®å®è¡å¯èœãã¡ã€ã«ãå®è¡ããèš±å¯ãäžãããšãããã»ã¹ã¯å€§å¹ ã«ç°¡çŽ åãããŸãããã®ã°ã«ãŒãã«2人ç®ã®åŸæ¥å¡ã®ã¢ã«ãŠã³ããå«ããã ãã§ååã§ãã æããã«ããã®ãªãã·ã§ã³ã¯enikeyschikïŒãããã®æäœãå®è¡ããå¿ èŠããããŸãïŒã®æ¹ãã¯ããã«åçŽã§ãããã·ã¹ãã 管çè ïŒåŸã§enikeyshikerãäœãããããææ¡ããå¿ èŠããããŸãïŒã«å¯ŸããŠééçã§ãã
ã°ã«ãŒãã®éèŠæ§ã«ã€ããŠäžçŽã®ååãšè°è«ããããšã¯ãããåã«ããããPowerShellé¢æ°ãšããŠäœæããå¯èœæ§ãèªèããŸãã
<# .SYNOPSIS AD OU. .Description (Organization Unit). .PARAMETER Path , . .PARAMETER Name .PARAMETER Force . , OU . .OUTPUTS $null. . #> Function New-ADGroup([STRING]$Path, [STRING]$Name, [System.Management.Automation.SwitchParameter]$Force) { # , $ErrorActionPreference = "SilentlyContinue" If ($Force -eq $true) { New-ADOrganizationUnit -Path $Path } # DN $OUDN = Convert-ADPath2DN -Path $Path # - $OUDN = "LDAP://$OUDN" $OU = [ADSI]"$OUDN" # $Group = $OU.Create("group", "cn=$Name") $Group.Put("sAMAccountName", "$Name") $Group.SetInfo() # Trap { # , : # " " if ($_.Exception.ErrorCode -eq $SYSTEM_ERROR_CODE_OU_ALREADY_EXISTS) { Write-Host " $Name $Path " } } }
ã芧ã®ãšããã System.DirectoryServices.DirectoryEntryã¯ã©ã¹ã®Createã³ã³ã¹ãã©ã¯ã¿ãŒã®ããŒãžã§ã³ã® 1 ã€ãããã§äœ¿çšãããŠããŸãã
ç¹°ãè¿ããŸãããé¢æ°ã®äœ¿çšã¯åºæ¬ã§ãïŒAD / LDAPã®çµç¹åãšç®¡çã®åéã§ç¹å¥ãªç¥èãæããªãåãååã§ããååãããã«ç解ã§ããããã«ãæ§æãåçŽåããããšãç¹ã«è©Šã¿ãŸããïŒã
# "gSales" "Unit1". - . New-ADGroup -Path "example.com/Test/MySuperScriptingResults/Fatal/Unit1" -Name "gSales" -Force
ã°ã«ãŒãããªã·ãŒãªããžã§ã¯ãã®äœæãšãªã³ã¯
ActiveDirectoryãšã¯äœã§ããïŒ ãŠã£ãããã£ã¢ã«ãããšãããã¯MSã®LDAPæºæ ã®ãã£ã¬ã¯ããªãµãŒãã¹å®è£ ã§ãã ã·ã¹ãã 管çè ã¯ãããããã©ã¬ã¹ãããã¡ã€ã³ãããã³ä¿¡é Œãèšæ¶ããã»ãã¥ãªãã£ã¬ãŒãã¯èªèšŒã¡ã«ããºã ãèšæ¶ããeneykeyschikã¯ã°ã«ãŒãããªã·ãŒã«ã€ããŠè©±ããŸãã
ãªã圌ãã«ã€ããŠïŒ 圌ãã¯enikeyschikã®å šè·æ¥ç掻ãæã£ãŠããŸãïŒã¯ãŒã¯ã¹ããŒã·ã§ã³ã«ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãã IEèšå®ãããã¯ãããŠãŒã¶ãŒãããŸããŸãªã* -Barsãã SRPãã€ã³ã¹ããŒã«ã§ããªãããã«ããå€åæéäžã®ã²ãŒã ã®åé¡ã解決ããããã«å·Šã«ç§»åããã®ã倧奜ããªã¿ã¹ã¯ããŒãããã¯ããŸã ãenikeyschikãããã«ãå ã®ç¶æ ã«æ»ãããšãèŠæ±ããŸãããããªããã°ãä»äºãããããšã¯äžå¯èœã§ããã ããããç§ã¯æãåºã«æ·±ãå ¥ã蟌ã¿ãŸããã Windowsãããã¯ãŒã¯ã§ã®GPOã®éèŠæ§ã«ã€ããŠã®è«æã«ã¯ã誰ãè°è«ããªããšæããŸã ã
ãŸããGPOã¯å¿ èŠã§éèŠãªã®ã§ãäœæããã©ã€ãã©ãªã«GPOãæäœããããã®ã¡ã«ããºã ãå«ããå¿ èŠããããŸãã æåã«GPOã§äœãããå¿ èŠããããŸããïŒ ãã¡ããããããäœæããŸãïŒæããã«ãäœæã®åã«æäœã¯ã§ããŸããïŒïŒ
<# .SYNOPSIS . .Description . COM- GPMC (, GPMC ). .PARAMETER DomainDNSName FQDN- , . .PARAMETER GPOName . .OUTPUTS GPMGPO. . #> Function New-GPO([STRING]$DomainDNSName,[STRING]$GPOName) { $GPM = New-Object -ComObject GPMgmt.GPM # $GPMConstants = $GPM.GetConstants() # $GPMDomain = $GPM.GetDomain($DNS_DOMAIN_NAME, $DNS_DOMAIN_NAME, $Constants.UseAnyDC) # GPO $GPMGPO = $GPMDomain.CreateGPO() $GPMGPO.DisplayName = $GPOName Return $GPMGPO }
ãã®é¢æ°ã¯ããªããžã§ã¯ããªããžããªã«GPOãäœæããŸããããã以äžã¯äœæããŸããã ããã¯äŸ¿å©ã§ãããå®éã®äœ¿çšã«ã¯ååã§ã¯ãããŸãããäœæããããªããžã§ã¯ãããŠãããã«ãªã³ã¯ ïŒ ãªã³ã¯ ïŒããå¿ èŠããããŸãã ããããªããã°ããéã¢ã¯ãã£ããã®ããã«æ®ããŸãïŒå³å¯ã«èšãã°ãã¢ã¯ãã£ãã§ããã圱é¿ç¯å²ã¯åã«å®çŸ©ãããŠããŸããïŒã ãŸããOUã«ããªã·ãŒãæ·»ä»ããã«ã¯ããã®ãªããžã§ã¯ãè¡šçŸãååŸããå¿ èŠããããŸãã ããšãã°ã次ã®ããã«ãGPOã®ååãç¥ã£ãŠãååŸããããšããã®ã¯è«ççã§ãã
<# .SYNOPSIS COM- GPO . .Description GPO, . .PARAMETER DomainDNSName FQDN- , GPO. .PARAMETER GPOName GPO, . .OUTPUTS GPMGPO. COM- GPO ( $null, GPO ). #> Function Get-GPO([STRING]$DomainDNSName,[STRING]$GPOName) { $GPMGPO = $null # $ErrorActionPreference = "SilentlyContinue" # , GPMC $GPM = New-Object -ComObject GPMgmt.GPM # $GPMConstants = $GPM.GetConstants() # GPMDomain, $GPMDomain = $GPM.GetDomain($DomainDNSNAme, $DomainDNSNAme, $GPMConstants.UseAnyDC) # $GPMGPO = $GPMDomain.SearchGPOs($GPM.CreateSearchCriteria()) | Where-Object{$_.DisplayName -eq $GPOName} # GPO. - $null. Return $GPMGPO }
ååã§GPOãæ€çŽ¢ããããã®ã¡ã«ããºã ãæŠåšåº«ã«çšæããŠã次ã®ããã«ãã€ã³ãããããšãã§ããŸãã
<# .SYNOPSIS (Link) (OU). .Description GPO . - . .PARAMETER DomainDNSName FQDN- , . .PARAMETER GPOName GPO. . .PARAMETER OUPath , GPO. .OUTPUTS $Null. . #> Function Mount-GPOToOU ([STRING]$GPOName,[STRING]$OUPath,[STRING]$DomainDNSName) { # GPO $GPMGPO = Get-GPO -DomainDNSName $DomainDNSName -GPOName $GPOName # , If ($GPMGPO -ne $Null) { # DN $OUDN = Convert-ADPath2DN -Path $OUPath # COM- GPMC $GPM = New-Object -ComObject GPMgmt.GPM $GPMConstants = $GPM.GetConstants() $GPMDomain = $GPM.GetDomain($DomainDNSName, $DomainDNSName, $Constants.UseAnyDC) # $GPMSOM = $GPMDomain.GetSOM($OUDN) # (Link) GPO $GPMSOM.CreateGPOLink(-1, $GPMGPO) | Out-Null trap { # COM-. . # , , . continue } } # GPO , else { Write-Host "Cannot find a GPO object named $GPOName" Throw "Cannot_find_GPO" } }
æåŸã®æ©èœã§ã¯ãæ°ããäœæãããã ãã§ãªãããªããžããªå ã®GPOããã€ã³ãã§ããŸãã ãã®æ©èœã®ã¢ããªã±ãŒã·ã§ã³ã®1ã€ã¯ã以åã«äœæãããã°ã«ãŒãããªã·ãŒãªããžã§ã¯ãããã°ãããéçšç°å¢ã«å°å ¥ãããããšã§ãããæåã«ç¹å¥ãªå¥ã®ãŠãããïŒOUïŒã§ãã¹ãããããã®åŸãã·ã¹ãã 管çè ãããã¹ãããã³æ¿èªãåŸãåŸã
现å¿ã®æ³šæãæã£ãèªè ã¯ã GPMC COMãªããžã§ã¯ãã®çšéãå°ããå ŽåããããŸãã ãã¹ãŠãéåžžã«åçŽã§ãã.NETã¯é«ã¬ãã«ã®æœè±¡åãæäŸããäžéšã®æäœã®å®è¡ãèš±å¯ããŸããã ããšãã°ãGPOãçµç¹åäœã«ãã€ã³ãããæ¹æ³ãèŠã€ãããŸããã§ãããSystem.DirectoryServices.DirectoryEntryã䜿çšããŠGPOïŒä»¥äžãåç §ïŒãã€ã³ããŒãããã³ãšã¯ã¹ããŒãã§ããŸããã§ããã GPMCã䜿çšãããšããããã®æé ãå®è¡ã§ããã ãã§ãªããæ¯èŒçç°¡åã«å®è¡ã§ããŸãã
GPOèšå®ã®ã€ã³ããŒããšãšã¯ã¹ããŒã
ãã®ãããã°ã«ãŒãããªã·ãŒãªããžã§ã¯ããšãŠããããžã®ãã€ã³ãã£ã³ã°ãäœæããæ©äŒããããŸãã ç®æšãæãåºããŸããã-ãªãããããã¹ãŠã®æ©èœãéçºããã®ã§ããããïŒ åœŒã®åªåã§ãšãããŒã¹ãã¯ãå©ããããã«ã enikeyschikã«ã¯ã©ã®ãããªæ¯æŽãå¿ èŠã§ããïŒ åœŒãå®è¡ãã¹ãæ¥åžžæ¥åã®èªååã GPOã«é¢é£ããã®ã¯ã©ãã§ããïŒ ååãšããŠãã·ã¹ãã 管çè ãéçºããå€ãã®ãããã¯ãŒã¯ïŒãŸãã¯åããã¡ã€ã³ã®ç°ãªãOUïŒã®GPOãã©ã¡ãŒã¿ãŒã«å€æŽãå ããããšã«ã€ããŠè©±ããŸãã
éåžžãããã¯èµ·ãããŸããããšãã°ãã»ãã¥ãªãã£ã¬ãŒãã¯ããªã ãŒããã«ã¡ãã£ã¢äžã®æ å ±ã®ãåé€ããçŠæ¢ããããã«ããããã®äœ¿çšãçŠæ¢ããããšã決å®ããŸãã ã·ã¹ãã 管çè ã¯ã察å¿ããGPOèšå®ã®èª¬æ ïŒæé ïŒãæºåãããããã®å€æŽããããã¯ãŒã¯ã§è€è£œããããã«enikeyshchikovã«æ瀺ããŸãã
å€ãã®å€æŽããããããã«æªãããšã«ããããã¯ãŒã¯ããããŸãã ãã®çµæãenikeyschikã¯1æ¥äžè€è£œã«å¿ãããè©°ãŸã£ãçšçŽãããªã³ã¿ãŒããåŒãåºãããããã€ã¬ã®ãªãŒãã£ãªã·ã¹ãã ã«å¿ èŠãªã¬ããŒããªãŒãæäŸããããäŒèšå£«ã®åšåŠçã®ãšãã»ã€ãWebã§èŠã€ããããææªã®å ŽåããŠãŒã¶ãŒã«åããä»»æã®ããŒãããããŸãã
ãããŠãããã§å šèœã®MSã¯ãGPMCã®ãã¬ãŒã ã¯ãŒã¯å ã«å®è£ ãããç¬èªã®GPOèšå®ã€ã³ããŒã/ãšã¯ã¹ããŒãã¡ã«ããºã ãåããããŒããŒããšãã©ã€ããŒã®æŠéæ©ã®å©ãã«ãªããŸãã ãã®ã¡ã«ããºã ã«ãããããã2ã€ã®GPOïŒãããŒãšåä¿¡è ïŒãç°ãªããã¡ã€ã³ã«ããå Žåã§ãã1ã€ã®GPOã§æå®ãããèšå®ãå¥ã®GPOã«ã€ã³ããŒãã§ããŸãã Powershellã䜿çšãããšãããã»ã¹ãå®å šèªååã§ããŸãã
åç §ããªã·ãŒãã·ã¹ãã 管çè ã«ãšã¯ã¹ããŒãããæé ã¯ãã®ãŸãŸã«ããŠã ã€ã³ããŒããèªåã§è¡ããŸãã ãŸããGPOããã¯ã¢ãããšã¯äœããèããŸãïŒMSèªäœã¯ããšã¯ã¹ããŒãã§ã¯ãªãããã¯ã¢ããã§ãããšäž»åŒµããŠããŸãïŒã
ãã®äŸã®ãã©ã«ããŒåã¯ããšã¯ã¹ããŒããããGPOã®äžæã®èå¥åã§ãã ã€ã³ããŒããããšãã«å¿ èŠã«ãªãã®ã§ããã®GUIDãååŸããæ¹æ³ãåŠã¶ã®ãããã§ãããã ç§ã¯ãããã¯ãŒã¯ã®æ°éäŒæ¿ã®æåãªãã£ã©ã¯ã¿ãŒãæã«å ¥ããããšæããŸããããã®èå¥åãååŸããæãç°¡åãªæ¹æ³ã¯ãããšãã°æ¬¡ã®ããã«ãã©ã«ããŒåã調ã¹ãããšã§ãã
<# .SYNOPSIS GUID GPO () . .Description GPO, , - GUID, GUID' . , GPO GUID'. - GUID' . .PARAMETER Path Path - , GPO. .OUTPUTS System.String. GUID GPO, . #> Function Get-ExportedBackupGUID([STRING]$Path) { #, , - If (-not (Test-Path $Path)) { Write-Host " $Path " Throw "Backup dir path not found" } # $Children = Get-ChildItem -Force -LiteralPath $Path # , GUID' Foreach ($Child in $Children) { If ($Child.FullName -match "^*\{\w{8}\-(\w{4}\-){3}\w{12}\}$") { Return $Matches[0] } } # , GPO . Write-Host " $Path " Throw "GPO Backup(s) not found" }
ãšã¯ã¹ããŒããããGPOã®GUIDãããã£ããããã®èšå®ãADãªããžããªã®ä»»æã®GPOã«ããŒãã§ããŸãã
<# .SYNOPSIS GPO . .Description , GPO. , , GPO. GPO , . .PARAMETER BackupPath GPO .PARAMETER DNS_DOMAIN_NAME FQDN- , (). .PARAMETER MigrationTablePath . . .PARAMETER NewGPOName , . , (.. GPO , GPO-). .OUTPUTS $null. . #> Function Import-GPO ([STRING]$BackupPath, [STRING]$DNS_DOMAIN_NAME, [STRING]$MigrationTablePath, [STRING]$NewGPOName = "") { # GPO. , If (-not (Test-Path $BackupPath)) { Write-Host " GPO: $BackupPath" Throw "GPO Backup path not found" } # COM- GPMC - $GPM = New-Object -ComObject GPMgmt.GPM $GPMConstants = $GPM.GetConstants() $GPMDomain = $GPM.GetDomain($DNS_DOMAIN_NAME, $DNS_DOMAIN_NAME, $Constants.UseAnyDC) # GPMBackupDir, $GPMBackupDir = $GPM.GetBackupDir($BackupPath) # GUID GPO $BackupGUID = Get-ExportedBackupGUID -Path $BackupPath # - GPO $GPMBackup = $GPMBackupDir.GetBackup($BackupGUID) # GPO, : , # , If ($NewGPOName -eq "") { $TargetGPOName = $GPMBackup.GPODisplayName } else { $TargetGPOName = $NewGPOName } # GPO, $GPMGPO = Get-GPO -DomainDNSNAme $DNS_DOMAIN_NAME -GPOName $TargetGPOName # GPO , If ($GPMGPO -eq $Null) { $GPMGPO = New-GPO -DomainDNSNAme $DNS_DOMAIN_NAME -GPOName $TargetGPOName } # GPO $GPMGPO.Import(0, $GPMBackup) | Out-Null }
次ã®ã³ãŒãã¯ãGPOãæäœããããã«èª¬æããé¢æ°ã䜿çšããäžè¬çãªäŸãšããŠäœ¿çšã§ããŸãã
##: "c:\good_gpo\" , , . #: ( ), "example.com/TestUnits/OU1" ##: # GPO "Imported_good_GPO" ( ). Import-GPO -BackupPath "c:\good_gpo\" -Dns_Domain_Name "example.com" -NewGPOName "Imported_good_GPO" # OU Mount-GPOToOU -GPOName "Imported_good_GPO" -OUPath "example.com/TestUnits/OU1" -DomainDNSName "example.com"
GPOã¢ã¯ã»ã¹
, Windows AD, , , GPO, .
, OU «Users», .. () - .. () : " pAllow_Run_Any_Executable ", , , , , " pDisallow_Run_Anything_Except_HelpDesk ", , .
æããã«ãæåã®GPOã¯ãŠãŒã¶ãŒLoginov-Parolevã«åœ±é¿ãäžããããšãªãMr. Glavnovskyã®ã¢ã«ãŠã³ãã«åœ±é¿ãäžãã2çªç®ã®GPOã¯2çªç®ã®GPOã«åœ±é¿ãäžããŸãããããã®GPOãæ¬è³ªçã«äºãã«ççŸããŠããããšãåæ§ã«æããã§ãã
ã€ãŸã , GPO. , , (OU) GPO, . , AD , .
( â ) , GPO . , , .
" gAllow_Run_Any_Executable ", GPO " pAllow_Run_Any_Executable " . â .
, ,
MSDN , GPO (, , AD) System.DirectoryServices.ExtendedRightAccessRuleããã®ãããªãªããžã§ã¯ãã«ã¯ãã¢ã¯ã»ã¹ã«ãŒã«ã®ãšã³ããªã«é¢ããæ å ±ãå«ãŸããŠããŸãã誰ã«ãäœãæ£ç¢ºã«çŠæ¢ãŸãã¯èš±å¯ãããŠãããã
# PowerShell , ACE, $NewRule = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $objTrustee, $objRihgt, $objACT
ArgumentListãä»ããŠæž¡ãããåŒæ°ãåŠçããŠã¿ãŸããããæçœãªããšããå§ããŸãããïŒ$ objTrusteeã¯ããã®ã«ãŒã«ãé©çšãããã»ãã¥ãªãã£ãµããžã§ã¯ãã§ããããšãã°ããŠãŒã¶ãŒãŸãã¯ã»ãã¥ãªãã£ã°ã«ãŒããç°¡åã«èšãã°ãããã¯ããã®ã«ãŒã«ãé©çšããã察象ãã§ãããããŒã·ã£ã¯ãVaska
éåžžã®enikeyschikã®èŠ³ç¹ããïŒãããã®åŸæ¥å¡ã¯ãèè ãèããŠããããã«ããã®èšäºã§èª¬æããæŸèæã®ã»ããã®äž»ãªãŠãŒã¶ãŒã§ãïŒãã»ãã¥ãªãã£ã®äž»é¡ã圌ã®ååã§ç€ºãã®ãæãç°¡åã§ãããã ããããã§èæ ®ãã¹ã埮åŠãªéãããããŸããWindowsã®èšèªããŒãžã§ã³ããšã«ååãç°ãªãæšæºçãªã»ãã¥ãªãã£ããªã³ã·ãã«ãéåžžã«å€ããããŸããããšãã°ãè±èªçã®Windowsã®ã管çè ãã®ååã¯ã管çè ãã§ãã
ãã®åé¡ã解決ããããã«ãMSã¯ãã¹ãŠã®OSããŒã«ãªãŒãŒã·ã§ã³ã§å€æŽãããŠããªãç¹å¥ãªèå¥åã®äœ¿çšãèãåºããŸããã次ã«ããããã®äœ¿çšæ¹æ³ãåŠç¿ããã ãã§æžã¿ãŸããåæåã䜿çšããæãç°¡åãªæ¹æ³ã¯System.Security.Principal.WellKnownSidTypeã§ãã
# SID $SID = [System.Security.Principal.WellKnownSidType]::AccountDomainAdminsSid
æ³åŸã®äž»é¡ãããç¥ãããŠããªãå ŽåïŒã€ãŸããæšæºã®ã»ãã¥ãªãã£äž»é¡ã®ãªã¹ãã«å«ãŸããŠããªãå ŽåïŒãSystem.Security.Principal.NTAccountã¯ã©ã¹ã®ãªããžã§ã¯ããšããŠã®è¡šçŸã¯ãååã§ååŸã§ããŸãã
[STRING]$FQDN = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name $objTrustee = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList "$FQDN", "$Trustee"
ãããã£ãŠãç§ãã¡ã¯æ³ã®äž»é¡ã®è¡šçŸãäœæããããšãåŠã³ãŸããïŒç§ãã¡ã¯ãããèš±å¯/çŠæ¢ããŸãïŒãä»ãããªããäœæããå¿ èŠããããæ³åŸèªäœã®è¡šçŸãã$ objRihgtïŒãããèš±å¯ãŸãã¯æåŠããããšïŒãäžèšã®äŸã¯ããå€æŽãå ãããæš©å©ã瀺ããŠããŸã[ãã¡ã€ã³sales.example.comã«å¯ŸããŠ]ã
ãåç¥ã®ããã«ãã¢ã¯ã»ã¹èš±å¯ã®çš®é¡ïŒãèªã¿åããããæžã蟌ã¿ãããåé€ããªã©ïŒã®æ°ã¯å¶éãããŠããããããã¯ãã¹ãŠåæåSystem.DirectoryServices.ActiveDirectoryRightsã®æå¹ãªå€ã®ãªã¹ãã«å«ãŸããŠããããã次ã䜿çšããŠãã¥ãŒãäœæããã®ãæãç°¡åã§ã察å¿ããã³ã³ã¹ãã©ã¯ã¿ãŒãé¢æ°ã§ã©ããããã䜿ããããã®ããïŒ
<# .SYNOPSIS System.DirectoryServices.ActiveDirectoryRights . .Description System.DirectoryServices.ActiveDirectoryRights. . .PARAMETER StrRight System.DirectoryServices.ActiveDirectoryRights. .OUTPUTS System.DirectoryServices.ActiveDirectoryRights $null. System.DirectoryServices.ActiveDirectoryRights, , $null ( ) #> Function Convert-ToAccessRight([STRING]$StrRight) { $Res = $null $ErrorActionPreference = "SilentlyContinue" $Res = [System.DirectoryServices.ActiveDirectoryRights]::$StrRight $ErrorActionPreference = "Stop" Return $Res }
( " "), $objACT â (, «» (Allow), «» (Deny)). , MSDN , System.Security.AccessControl.AccessControlType , ( ) :
# $objACT = [System.Security.AccessControl.AccessControlType]::Allow # $objACT = [System.Security.AccessControl.AccessControlType]::Deny
:
<# : "gForbidden_Users" GPO "pForbidden_GPO" "Example.com" #> #: # , [STRING]$FQDN = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name # "gForbidden_Users", $objTrustee = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList "$FQDN", "gForbidden_Users" # $objActDeny = [System.Security.AccessControl.AccessControlType]::Deny # $objRihgt = [System.DirectoryServices.ActiveDirectoryRights]::GenericRead # " 'gForbidden_Users' ". GPO 'gForbidden_Users' $NewRule = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $objTrustee, $objRihgt, $objACT # GPO . $GPMGPO = Get-GPO -DomainDNSName "Example.com" -GPOName "pForbidden_GPO" # COM- .NET- System.DirectoryServices.DirectoryEntry [STRING]$GPOPath = $GPMGPO.Path $objGPO = New-Object System.DirectoryServices.DirectoryEntry -ArgumentList "LDAP://$GPOPath" # GPO # , $objGPO.ObjectSecurity.AddAccessRule($NewRule) | Out-Null # . $objGPO.CommitChanges() | Out-Null
ååãšããŠãããã§GPO ADãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹æš©ã®å€æŽãå®äºããŸãããã ããããã«ã¯åŸ®åŠãªéãããããŸããäºå®ãåã°ã«ãŒãããªã·ãŒãªããžã§ã¯ãã«ã¯ããã¡ã€ã³DFSïŒ\\ domanname.example.com \ SYSVOL \ïŒã«ãã©ã«ããŒããããŸãããŸãããã®ãã©ã«ããžã®ã¢ã¯ã»ã¹æš©ã¯ãéåžžãGPOèªäœã«èšå®ãããã¢ã¯ã»ã¹æš©ã«å¯Ÿå¿ããŠããŸããããã«ããããã®æš©å©ãç°ãªãå ŽåãGPMCã¯å¯Ÿå¿ãããšã©ãŒãçæããŸãã
ãã®ãããªéåæåã«ã€ããŠèãããšãè«ççã§ããäžèšã®ã³ãŒãã§ã¯ããã¡ã€ã«ã·ã¹ãã ã«è§ŠããããšãªãGPOãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹æš©ãå€æŽããŸãããã¡ãããé¡æšã«ãã£ãŠSYSVOLã®ãã©ã«ããŒã®ã¢ã¯ã»ã¹èš±å¯ãå€æŽããã³ãŒããè¿œå ã§ããŸããããã£ãšç°¡åãªæ¹æ³ããããŸããããã¯ãGPOèªäœã®ã¢ã¯ã»ã¹èš±å¯ãå€æŽãããšãGPMCããã©ã«ããŒã®ã¢ã¯ã»ã¹èš±å¯ãèªåçã«ä»å ãããšããäºå®ã«åºã¥ããŠããŸãããããã£ãŠãGPMCã³ã³ãœãŒã«ã䜿çšããŠåœã®å€æŽãå ããã ãã§ååã§ãããããïŒã³ã³ãœãŒã«ïŒãéä¿¡èªäœãåŠçããŸãã
#FQDN- $DomainDNSName = "Example.com" # GPO, $GPOName = "pForbidden_GPO" # GPO $GPMGPO = Get-GPO -DomainDNSName $DomainDNSName -GPOName $GPOName # $GPOSecurityInfo = $GPMGPO.GetSecurityInfo() # , . # GPMC SYSVOL. $GPMGPO.SetSecurityInfo($GPOSecurityInfo) | Out-Null
ãããã«
äžå®ã®ãæ £ãããæéã®åŸãåã ã®AD管çã¿ã¹ã¯ã®ã¹ã¯ãªããã®äœæïŒãŸãã¯ä»¥åã«äœæãããç·šéïŒããåãã¿ã¹ã¯ãæåã§è§£æ±ºãããããã¯ããã«åªããŠããããšã«æ°ä»ããŸãããç¹ã«ãå®è¡ããå¿ èŠããããã¹ãŠã®æäœã«äŸ¿å©ãªäžé£ã®æ©èœãèªç±ã«äœ¿çšã§ããå Žåã
ããããenikeyshchiki-人ã ã¯æ ãè ã§ããããã°ããããŠã¹ã¯ãªãããæžããŠADã管çããããã®ã¿ã¹ã¯ãççŽã«éå±ãããŸãããã·ã¹ãã 管çè ãµãŒããŒããXMLãã¡ã€ã«åœ¢åŒã®ã¿ã¹ã¯ãããŠã³ããŒãããåå ããã«ãããã®ã¿ã¹ã¯ãå®è¡ã§ããããŠãããŒãµã«ç®¡çã·ããªãªãã®äœæã§å ·äœåãããã¡ã«ããºã ã®ãããªãçºå±ã«ã€ããŠã®èãããããŸããèªèšŒãŠã£ã³ããŠã«ãã°ã€ã³ãå ¥åãããããŒããŒããã¯ã€ããããªã©ïŒã
çµæã®ã¡ã«ããºã ã®å®å šãªèª¬æã¯ãæããã«ãã®èšäºã®ç¯å²å€ã§ããã¹ã¯ãªãããã¢ãžã¥ãŒã«æ§é ãåãåããã¢ãžã¥ãŒã«ã®1ã€ãCM_ActiveDirectoryã§ããã説æãšãšãã«å©çšå¯èœã§ãããšããäºå®ã®ã¿ã«æ³šæããŸãpasteBinã§ãæ£åžžã«åäœãããã«ã¯ããã®ã·ã¹ãã ã®ä»ã®ãã¹ãŠã®ã¢ãžã¥ãŒã«ãšåæ§ã«ãCM_Systemã¢ãžã¥ãŒã«ãããŒãããå¿ èŠããããŸããCM_Systemã¢ãžã¥ãŒã«ã¯ïŒå¯Ÿå¿ããèšè¿°ãã¡ã€ã«ãšãšãã«ïŒããããããŠã³ããŒãã§ããŸãã
èªè ãæ瀺ãããæ å ±ãå¿ èŠãšããªãããšãé¡ã£ãŠããŸãã2012幎ãå€ãã®ãã¡ã€ã³ãéäžç®¡çããå¿ èŠã®ãã人ã ãäŒæ¥ãé©åãªããŒã«ãæäŸãã説æããããªãã£ã¹ãå¯äžã®äžå¿«ãªäŸå€ã§ãããšä¿¡ããããããããåæ§ã®ç¶æ³ã«é¥ã£ãå Žåã§ãã絶æããªãã§ãã ããïŒã芧ã®ããã«ããå€ããã䜿çšããŠããç®çã®çµæãåŸãããšãã§ããŸãã
ååã«æé©ãªããŒã«ïŒ