最近接了个活,公司有1200多个人的域账号密码需要更改,遂自己写了个批量的脚本实现,效率美滋滋。
首先是要去拿到用户的信息,然后改一个随机的密码,再捞出用户的手机号码,把密码发送出去。
用户的账号我已经有了,那就把他们放到文本文件里面,直接就可以把里面的信息取出来,
1
| $users = Get-Content $userListPath
|
但发现每次写死路径很不方便,改来改去的,那就直接调用系统选择文件对话框嘛,
1 2 3 4 5 6 7 8 9 10 11 12
| Add-Type -AssemblyName System.Web
Function Get-FileName($initialDirectory) { [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.initialDirectory = $initialDirectory $OpenFileDialog.filter = "TXT (*.txt)| *.txt" $OpenFileDialog.ShowDialog() | Out-Null return $OpenFileDialog.FileName }
|
用这个函数,调用一次就会出现选择文件对话框。通过$OpenFileDialog.filter来控制,可以自定义要过滤的文件类型,选择完了之后,默认会输出成功与失败的提示。我不想看到这个提示,就直接在后面加个管道out-null了,选择好文件,该函数就会返回该文件的路径,拿到这个路径,就可以用get-content拿到其中的名字了。
拿到名字得先处理一下,因为在域里面名字中间有空格容易出错,得先把它们的空格替换成.
1 2
| $UserName = $rawUserName -replace " ","."
|
拿到名字了,继续捞其他信息, 首先是名字
1
| $aduser = get-aduser -server yourdomain.com $UserName
|
然后是手机
1
| $aduserPhone = (Get-ADUser -Server server.com $UserName -Properties mobile | select mobile).mobile
|
接下先创建凭证,这样才能改密码,因为脚本还要给同事用嘛,把密码直接写进去还是不太好,所以得加密。
我写了个小脚本,把输入密码进去,就会把生成好的加密字符串复制到剪贴板,很方便,下面是代码,复制保存为ps1后缀的文件就可以用啦。
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
| Add-Type -AssemblyName System.Windows.Forms
function Read-MessageBoxDialog
{
param ([string]$Message,
[string]$WindowTitle,
[System.Windows.Forms.MessageBoxButtons]$Buttons = [System.Windows.Forms.MessageBoxButtons]::OK,
[System.Windows.Forms.MessageBoxIcon]$Icon = [System.Windows.Forms.MessageBoxIcon]::None)
Add-Type -AssemblyName System.Windows.Forms
return [System.Windows.Forms.MessageBox]::Show($Message, $WindowTitle, $Buttons, $Icon)
}
write-host "请输入原始密码:↓↓↓↓" $inputPWD = Read-Host | ConvertTo-SecureString -AsPlainText -Force $encryptedPWD = $inputPWD | ConvertFrom-SecureString [Windows.Forms.Clipboard]::SetText($encryptedPWD)
Read-MessageBoxDialog -Message "已拷贝到剪贴板" -WindowTitle "安全密码制作工具" -Buttons OK -Icon Information
|
拿到密码之后,就可以制作自己的凭证了。
1 2 3
| $User = "yourAccount" $Pwd = "加密密码" | ConvertTo-SecureString $Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $Pwd
|
需要注意的是,本机制作的凭证,只可以在自己的机器上用,如果要在别的机器用,需要解锁,这个有点复杂,挖个坑以后再研究。
接下来就可以改密码了,我们先把随机密码准备好
1 2 3
| $PasswordLength = 16 $SpecialCharCount = 8 $Password =[System.Web.Security.Membership]::GeneratePassword($PasswordLength, $SpecialCharCount)
|
直接一个for循环遍历所有名单,更改密码
1 2 3 4
| Get-ADUser -Server wittyfans.com -Identity $UserName | Set-ADAccountPassword -NewPassword $SecPaswd -Server wittyfans.com -Credential $Credential Set-ADUser -Identity $UserName -ChangePasswordAtLogon $false -Server wittyfans.com -Credential $Credential |Unlock-ADAccount -Verbose -Server wittyfans.com -Credential $Credential
|
这个语句会直接给用户设一个新密码,并解锁他的账户。需要把其中的wittyfans.com变成你们自己的配置,其中有一个步骤需要注意的是,如果你去拿用户的信息,但这个名字错了,拿不到的话,会直接报错造成程序中断,这个时候得用try-catch语句处理,然后设置一个标记,通过这个标记去判断域中是否有这个用户。
最后就是输出数据啦,直接把所有数据保存起来,用out-file语句就可以保存成文本文件了,加上-Append,这样才不会把数据重写哦。
1
| Out-File -FilePath .\Desktop\ResetedPassWord.txt -Append
|
完工!