Scott's Blog

学则不固, 知则不惑

0%

PowerShell 批量改密码

最近接了个活,公司有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

完工!