这是一个非常悲伤的需求,整个逻辑弄的我有点吐血,幸运的是终于做完了。由于用到了太多变量,不写备注自己也看不懂,记录一下。


需求是这样的:某个用户位于某个安全组内,安全组在某个OU下。现在需要创建一个新的OU,只改变OU中的某一个关键词,其他部分照抄,创建一个计算机账号,放到新的OU下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#定义函数,参数是x,分别是1和2,生成的计算机的尾巴不一样
function  chuangjianjisuanjiX ( $xuhao )
{
     if  ( $xuhao  -eq  "1" )
     $xuhao  "-"  }
     elseif  ( $xuhao  -eq  "2" )
     $xuhao  "X"  }
     
     #计算机名的来源是更上一级的一个参数,员工编号
     $jisuanjiname  $jisuanji
     #获取中文名,其实这里最终没有用到
     $zhongwenming  =  ( Get-ADUser  $jisuanjiname ).name
     #识别创建计算机规则,即创建员工编号+序号的计算机名字
     $xingmingshibiechar  $jisuanjiname  $xuhao
     
     #获取操作时间
     $date  = date
     #准备后面 用的计算机描述信息
     $miaoshu  = ( Get-ADUser  $jisuanjiname  -Properties *).extensionAttribute1 + ( Get-ADUser  $jisuanjiname ).name
     #这是另外一种描述信息,备注掉了,暂时不用。
     #$miaoshu = (Get-ADUser $jisuanjiname).name + "使用," + (get-aduser $env:USERNAME).name + "创建。时间是" + $date
     
     #获取用户所在的OU。
     #$newcomputerou = (Get-ADUser $jisuanjiname).DistinguishedName
     #获取最终应该放置的计算机OU
     #这里比较长,首先获取这个用户所在的安全组和邮件组,然后后去组信息,查找符合条件的安全组,最后获取这个安全组的DistinguishedName,也就是它的OU名
     $newcomputeroux  = (( Get-ADUser  $jisuanjiname  -Properties *).memberof |  Get-ADGroup  | ?{  $_ .distinguishedname  -match  "xxxxxxxxxxxx"  }).DistinguishedName
     #获取一下安全组的名字的长度,这个和上面的类似,很简单,不说了。
     $yhmchangdu  = (( Get-ADUser  $jisuanjiname  -Properties *).memberof |  Get-ADGroup  | ?{  $_ .distinguishedname  -match  "xxxxxxxxxxxx"  }).name.Length
     #关键字替换,把原来OU中的xxx换成计算机OU,这里 有个remove+4的操作,具体的大家可以试试,很巧妙。
     $newcomputerou  $newcomputeroux .Replace( 'xxxx' '计算机OU' ).remove(0,  $yhmchangdu  + 4)
     #从OU中去除尾部比较长的部分,一般就是www.contoso.com部分,这样最终循环的时候可以少运行一些
     $quchuxinxi  "xxxxx"
     #需要创建的OU列表,有个数,如果计数4个,实际上OU有3个,进行一个循环
     #下面这行其实不应该备注的,因为显色有点问题,我备注掉了。
     #$chuangjianOU = $newcomputerou.Replace($quchuxinxi,"").split(',')
     
     
     #统计需要删除的字符数
     $x  = 0
     #$yxserver = "xxxxxxxxxxx"
         #   定义两个数组阵列,空的,当前OU和部门名
     $dangqianOU  New-Object  System.Collections.ArrayList
     $bumenming2  New-Object  System.Collections.ArrayList
     #进入关键环节,循环部分,这里用到了创建OU的计数器,可以看一下。
     for  ( $i  = 0;  $i  -lt  $chuangjianOU .Count - 1;  $i ++)
     {
         #筛选,替换
         $bumenming  $newcomputerou .Replace( 'OU=' '' ).split( ',' )[ $i ]
         #把修改过的东西加到数组里面
         $bumenming2 .add( $newcomputerou .Replace( 'OU=' '' ).split( ',' )[ $i ]) |  Out-Null
         #计算需要删除的字符数,继续对OU名进行操作
         $x  +=  $bumenming .Length + 4
         $dangqianOU .add( $newcomputerou .Remove(0,  $x )) |  Out-Null
     }
     #进入下一个循环
     for  ( $i  = 0;  $i  -lt  $bumenming2 .Count;  $i ++)
     {
         #做一个倒数计数器
         $countx  $bumenming2 .count -  $i  - 1
         #创建新的组织单位,也就是OU,参数都是从上面获取的。因为OU要一级一级创建,所以这里计数器也是倒数的
         new-ADOrganizationalUnit  -name  $bumenming2 [ $countx ] -Path  $dangqianOU [ $countx ] -Server  $global:yxserver
     }
     #创建计算机
     New-ADComputer  -Name  $xingmingshibiechar  -path  $newcomputerou  -Server  $global:yxserver  -Enabled  $True  -Description  $miaoshu  #-ManagedBy $jisuanjiname  Location "Redmond,WA"#location是位置信息
     
     $information  $_ .used + "      " + $_.OU + "      " + $_.OU2 + "   " +  $date
     #设置一下计算机描述的特殊字段,这是我新加的,把原安全组的信息写进去
     Set-ADComputer  $xingmingshibiechar  -server  $global:yxserver  -Replace  @{ computerdis =  $newcomputeroux  }
 
 
}




本文转自 九叔 51CTO博客,原文链接:http://blog.51cto.com/jiushu/1705273,如需转载请自行联系原作者