通过 PowerShell 更改密码时,有没有办法绕过要求输入现有密码的提示?

通过 PowerShell 更改密码时,有没有办法绕过要求输入现有密码的提示?

下面我有一些代码,它会要求用户提供管理员凭据,如果他们在该域内,脚本将继续执行,然后重置他们选择的用户的密码。它有效......但是,我写这篇文章的人希望能够绕过默认出现的提示,在重置用户现有密码之前要求输入密码。他不知道每个人的密码,也不想去挖掘它。我在网上找不到任何关于如何做到这一点的信息。有人有什么建议吗?我的代码如下,下半部分只是添加了一个文本框,所以你可以忽略它。谢谢!

# 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

来源 : 通过 Set-ADAccountPassword Poweshell Cmdlet 重置密码

相关内容