在 Explorer 加载之前强制用户在登录时更改 AD 密码?

在 Explorer 加载之前强制用户在登录时更改 AD 密码?

背景

在我们的环境中,用户登录 Windows 7 PC,然后启动全屏 Citrix XenApp(与 Microsoft RDSH 相同)桌面。使用单点登录的 Citrix Reciever 启动 XenApp 桌面。所有工作都在 XenApp 桌面内完成。XenApp 服务器不一定与 Windows 7 计算机位于同一 AD 站点。

我们强制密码每 30 天到期一次。Windows 7 及更高版本会通过通知区域中的气球消息提示用户重置密码。这给我​​们带来了两个问题,如下所述:

问题

1) 用户在登录 Citrix XenApp 后,在 Windows 7 计算机上更改密码,例如按 C+A+D。XenApp 桌面会话仍使用旧密码进行身份验证。然后他们在 XenApp 中遇到问题,因为他们显然无法通过 IIS 服务器、SQL 服务器等进行身份验证。

2) 用户在 XenApp 会话中更改密码。这意味着他们的 Windows 7 计算机仍使用旧密码进行身份验证。他们可以通过锁定屏幕并使用新密码解锁来解决这个问题,但不幸的是,这会破坏 Citrix 客户端的单点登录过程,因此如果他们出于任何原因需要重新启动 Citrix XenApp,他们无法重新启动,除非他们注销 Windows 7 然后重新登录(这个人有同样的问题http://discussions.citrix.com/topic/333487-published-desktop-with-receiver-password-changing/)。

问题的关键在于,一旦 shell 已加载,用户就可以更改密码。当最终用户计算机运行 Windows XP 时,我们没有遇到此问题。我认为这是因为 Windows XP 在用户登录后立即提示用户更改密码,然后才启动 explorer.exe。

问题):

  • 我们可以配置 Windows 7 以提示用户在加载 shell 之前更改密码吗?
  • 如果没有,是否有第三方软件可以帮助我们解决这个问题?想必任何使用 Windows 7 及以上版本以及 RDSH/Citrix 桌面的组织都会遇到类似的问题。

答案1

解决方法是,您可以禁用即将过期的密码通知;这样,用户将只会收到密码过期的通知当它们真正过期时,因此在登录系统时必须更改它们。

可以通过 GPO 进行配置:https://technet.microsoft.com/en-us/library/ee829687%28v=ws.10%29.aspx

答案2

您可以使用以下 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“Users Europe”中名为“Powerusers”的组的示例

ForcePasswordChange -ADGroup "OU=Powerusers,OU=Users Europe,DC=internal,DC=international,DC=de"

您还可以创建一个计划任务,每三十天使用正确的参数运行此脚本,然后您无需再执行任何操作。

相关内容