Active DirectoryのユーザーIDのリストをファイルで読み取り、パスワードを無期限にするフラグをクリアするスクリプトを作成するタスクがありました。さらに、私のセキュリティ担当者は、この設定を持つ500人のユーザーがすぐにパスワードをリセットする必要がないようにしたくないので、スクリプトの実行時にデフォルトのドメインポリシーである90日を割り当てる必要があったため、ユーザーは通常のパスワードローテーションに陥ります。
それを行うためのPowerShellスクリプトを作成しようとしていて、問題が発生しています。確かに、私はPowerShellが得意ではないので、いくつかの入力をお願いします。
フラグをクリアする必要がありますが、PwdLastSetを-1に変更するのは注意が必要です。ファイルを読み取る方法がわからず、ファイルの読み取りから2つの "ForEach-Object"コマンドを実行するためと考えられます。誰か見ていただけませんか?
Import-CSV PasswordExpiry.csv | ForEach-Object {Set-ADUser -Identity $_.SamAccountName -PasswordNeverExpires:$false}
ForEach-Object {
$samaccountname = $_.SamAccountName
$today = Get-Date
$lastchange = [datetime]::FromFileTime($_.pwdlastset[0])
$timediff = New-TimeSpan $lastchange $(Get-Date)
$hoursdiff = $timediff.TotalHours
if ($hoursdiff -lt $hourschange_sincePwdChange) {
$todouser = Get-ADUser $samaccountname -Properties pwdLastSet
$todouser.pwdLastSet = 0
Set-ADUser -Instance $todouser
$todouser.pwdLastSet = -1
Set-ADUser -Instance $todouser
}
}
引数$ nullを受け入れることができないといういくつかの位置パラメーターエラーが表示されますが、どこが間違っているのかわかりません。
ADでは、パスワードが最後にリセットされた日付を変更できません。ただし、0(次回のログイン時にパスワードの変更を強制する)を除きます。そのためには、PwdLastSetを手動で設定することはできません。次のスニペットのようなものを使用する必要があります。
Set-ADUser -Identity JoeBlow -ChangePasswordAtNextLogon $true
ユーザーのpwdLastSet属性を(直接)変更できないため、あきらめます。この属性は、システム(ディレクトリサービスエンジン)自体によってのみ設定できます。 (ERROR_DS_ATTRIBUTE_OWNED_BY_SAM)
詳細については、MicrosoftのドキュメントMS-ADTSを参照してください。
私はこれを次のようにして達成することができました:
Import-Module ActiveDirectory
$ADUserParams=@{
'Searchbase' = 'OU=Users,OU=Testing,OU=IT,OU=XXX,DC=XXX,DC=local'
'Filter' = '*'
'Properties' = 'cn','sn','givenname','displayName','mail','description','UserPrincipalName', 'employeeNumber', 'profilepath', 'title'
}
$ADUsers = Get-ADUser @ADUserParams
ForEach ($ADUser in $ADUsers) {
$ADUser = Get-ADUser $ADUser -properties pwdlastset
$ADUser.pwdlastset = 0
Set-ADUser -Instance $ADUser
$ADUser.pwdlastset = -1
Set-ADUser -instance $ADUser
}
here から取得