背景:
私たちの環境では、ユーザーはWindows 7 PCにログオンしてから、フルスクリーンのCitrix XenApp(Microsoft RDSHと同じ)デスクトップを起動します。 XenAppデスクトップの起動には、シングルサインオンのCitrixRecieverが使用されます。すべての作業はXenAppデスクトップ内で行われます。 XenAppサーバーは、必ずしもWindows7マシンと同じADサイトにあるとは限りません。
パスワードの有効期限は30日ごとに適用されます。 Windows7以降通知領域のバルーンメッセージを介してパスワードをリセットするようにユーザーに促します。これにより、以下に詳述する2つの問題が発生します。
問題
1)ユーザーは、C + A + Dを押すなどして、Citrix XenAppに既にログインしているときに、Windows7マシンでパスワードを変更します。 XenAppデスクトップセッションは、引き続き古いパスワードを使用して認証されます。その後、明らかにIISサーバー、SQL Serverなどで認証できないため、XenApp内で問題が発生します。
2)ユーザーはXenAppセッション内でパスワードを変更します。これは、Windows7マシンが引き続き古いパスワードを使用して認証されていることを意味します。画面をロックし、新しいパスワードでロックを解除することでこれを修正できますが、残念ながら、これによりCitrixクライアントのシングルサインオンプロセスが中断されるため、何らかの理由でCitrix XenAppを再起動する必要がある場合は、Windows7からログオフしない限りできません。その後、戻ってください(この男は同じ問題を抱えています http://discussions.citrix.com/topic/333487-published-desktop-with-receiver-password-changing/ )。
問題の核心は、シェルがすでにロードされた後、ユーザーがパスワードを変更できることです。エンドユーザーのマシンでWindowsXPを実行した場合、この問題は発生しませんでした。これは、Windows XPが、ログオン直後、Explorer.exeが起動する前に、ユーザーにパスワードの変更を求めたためだと思います。
質問:
次のPowerShell関数を使用してこのタスクを実行できます。デスクトップアプリケーションは私の意見ではあまり意味がありません
function ForcePasswordChange
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$True)]
[string]$ADGroup,
[int]$Changes = "0"
)
Begin
{
Write-Warning "Script start for Group: $ADGroup"
}
Process
{
Try
{
Get-ADUser -Filter * -SearchBase $ADGroup | ForEach {
Set-ADUser -Identity $_.name -ChangePasswordAtNextLogon $true
$Changes++
}
}
Catch [System.Management.Automation.CommandNotFoundException]
{
Throw "Script has to run on a Domain Controller or on a Client with ActiveDirectory PowerShell Module installed. Script disrupted"
}
Catch [System.ArgumentException]
{
Throw "Could not resolve SearchBase (ADGroup) - ADGroup was $ADGroup. Script disrupted"
}
Catch [System.Management.Automation.ParameterBindingException]
{
Write-Error "Could not resolve Name Identity of one or multiple Users in ADGroup. Maybe ADGroup is empty. Script continues"
}
}
End
{
Write-Warning "Script has finished. $Changes Users must change their Password on next logon"
}
}
これをForcePasswordChange.ps1として保存し、ドットソースして、ドメインコントローラーのPowerShellセッションに関数をロードするだけです。
. C:\yourpath\ForcePasswordChange.ps1
次に、このように書くことができます
ForcePasswordChange -ADGroup "OU=GroupName,OU=Users,DC=DomainPrefix,DC=Domain,DC=com"
ドメインinternal.international.deのOU「UsersEurope」の「Powerusers」というグループの例
ForcePasswordChange -ADGroup "OU=Powerusers,OU=Users Europe,DC=internal,DC=international,DC=de"
30日ごとに正しい引数を使用してこのスクリプトを実行するスケジュールされたタスクを作成することもできます。そうすれば、もう何もする必要はありません。
回避策として、間もなく期限切れになるパスワードの通知を無効にすることができます。このように、ユーザーには期限切れのパスワードのみが通知されます実際に期限切れになったときしたがって、システムにログオンしたときにパスワードを変更する必要があります。
これは、GPOを介して構成できます: https://technet.Microsoft.com/en-us/library/ee829687%28v=ws.10%29.aspx 。