下面我有一些代码,它会要求用户提供管理员凭据,如果他们在该域内,脚本将继续执行,然后重置他们选择的用户的密码。它有效......但是,我写这篇文章的人希望能够绕过默认出现的提示,在重置用户现有密码之前要求输入密码。他不知道每个人的密码,也不想去挖掘它。我在网上找不到任何关于如何做到这一点的信息。有人有什么建议吗?我的代码如下,下半部分只是添加了一个文本框,所以你可以忽略它。谢谢!
# Function to generate a random password
function Generate-RandomPassword {
param (
[int]$Length = 12
)
$charPool = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:',.<>/?"
$password = ""
for ($i = 0; $i -lt $Length; $i++) {
$password += $charPool[(Get-Random -Minimum 0 -Maximum $charPool.Length)]
}
return $password
}
# Prompt user to enter admin credentials
$AdminUsername = Read-Host "Enter the admin username"
$AdminPassword = Read-Host "Enter the admin password" -AsSecureString
$AdminCredential = New-Object System.Management.Automation.PSCredential($AdminUsername, $AdminPassword)
# Verify if the provided admin is in the domain
$AdminExists = Get-ADUser -Filter {SamAccountName -eq $AdminUsername} -Credential $AdminCredential -ErrorAction SilentlyContinue
if ($AdminExists) {
# Prompt user to enter a username
$Username = Read-Host "Enter the username for which you want to change the password"
# Check if the Active Directory user exists
$UserExists = Get-ADUser -Filter {SamAccountName -eq $Username} -ErrorAction SilentlyContinue
if ($UserExists) {
# Generate a random password
$RandomPassword = Generate-RandomPassword
# Change the user's password
$SecurePassword = ConvertTo-SecureString -AsPlainText $RandomPassword -Force
Set-ADAccountPassword -Identity $Username -NewPassword $SecurePassword -Credential $AdminCredential
# Output the random password in a text box
Add-Type -AssemblyName PresentationFramework
$TextBox = New-Object Windows.Forms.TextBox
$TextBox.Multiline = $true
$TextBox.Text = $RandomPassword
$TextBox.SelectAll()
$Form = New-Object Windows.Forms.Form
$Form.Text = "Random Password"
$Form.Size = New-Object Drawing.Size(300, 100)
$Form.Controls.Add($TextBox)
$Button = New-Object Windows.Forms.Button
$Button.Text = "Copy Password"
$Button.Add_Click({
$TextBox.SelectAll()
$TextBox.Copy()
$Button.Text = "Copied!"
})
$Form.Controls.Add($Button)
$Form.ShowDialog()
# Log the operation in a text file
$LogEntry = "Date: $(Get-Date), Admin: $AdminUsername, User: $Username"
$LogPath = "C:\Temp"
Add-Content -Path $LogPath -Value $LogEntry
} else {
Write-Host "User '$Username' not found in Active Directory. Please enter a valid username."
}
} else {
Write-Host "Invalid admin credentials. Please make sure the provided admin is in the domain."
}
答案1
您的Set-ADAccountPassword
线路缺少-reset
参数。
如果你看一下https://learn.microsoft.com/en-us/powershell/module/activedirectory/set-adaccountpassword?view=windowsserver2022-ps您将看到“指定重置帐户的密码。使用此参数时,您必须设置 NewPassword 参数。您不需要指定 OldPassword 参数。”
所以你的代码行需要
Set-ADAccountPassword -Identity $Username -Reset -NewPassword $SecurePassword -Credential $AdminCredential
答案2
下面我有一些代码,它会要求用户提供管理员凭据,如果他们在该域内,脚本将继续执行,然后重置他们选择的用户的密码。它可以工作……但是,我编写此代码的人希望能够绕过默认情况下出现的提示,在重置用户现有密码之前要求输入密码。
需要明确的是,管理员想要更改任何用户的密码,而不是重置密码。
你想要的是不可能的。更改密码的唯一方法是知道(并提供)你的旧密码。任何其他不需要现有密码的方法实际上都会重置密码。如果您使用 EFS,这将永久禁用对任何加密文件的访问,除非在执行过去的重置之前导出证书。
此外,如果您的管理员知道用户帐户密码,那么他们所做的一切都是错误的。管理员唯一应该能做的事情就是重置帐户密码。与这位管理员可能声称的相反,在 Windows 上,管理员无权查看用户密码或以其他方式确定密码是什么。
Windows 管理员始终可以在不知道现有密码的情况下重置 Windows 帐户的密码,但根据显示的警告,除非证书存储在 AD 域服务器上或以其他方式导出,否则将无法访问加密文件。
要明确的是,Set-ADAccountPassword 可用于重置用户密码,但如果不知道现有密码,则无法更改密码。只有改变用户密码可防止丢失对加密文件的访问权限。
仅通过向我的域上的测试帐户传递一个变量来运行 Set-ADAccountPassword 和 ConvertTo-SecureString 的一个实例,即可成功重置用户的密码。但是,我必须重申这一事实,这重置了密码,但没有改变用户的密码。虽然从技术上讲,执行密码重置确实会更改密码,但密码重置和更改帐户密码是两件完全不同的事情。
答案3
您可以重置首先将密码存储在变量中,然后在 cmdlet 中使用它,即可获取 AD 用户密码而无需输入旧密码,如下所示:
$Pwd = ConvertTo-SecureString "MyNewPassword@123" -AsPlainText -Force
Set-ADAccountPassword -Identity AbbeyWarren -NewPassword $Pwd -Reset