首页 > 解决方案 > 获取密码过期的 Active Directory 用户列表

问题描述

再会!

我知道如何在 ActiveDirectory 中查看用户密码的到期日期:

  Public Shared Function GetPasswordExpirationDate1(ByVal userId As String) As Date
        Dim forestGc As String = String.Format("GC://{0}", Forest.GetCurrentForest().Name)
        Dim searcher = New DirectorySearcher(New DirectoryEntry(forestGc)) With {
            .Filter = "(sAMAccountName=" & userId & ")"
        }
        Dim results = searcher.FindOne().GetDirectoryEntry()
        Return CDate(results.InvokeGet("PasswordExpirationDate"))
    End Function

问题。如何显示密码将在 10 天后过期的用户的完整列表?列出在 DataGridView 中的字段:sAMAccountName 和密码到期日期。

标签: vb.netactive-directory

解决方案


我知道,因为看起来您正在尝试使用 vb.net 执行此操作,您只需运行以下 PowerShell 命令,然后将其输出通过管道传输到您想要的任何位置。您可能必须像下面的示例一样创建一个 PowerShell 实例,然后只需在 Win 表单应用程序中运行使用 C# 执行此操作的代码。

创建 Powershell 运行空间:

private string RunScript(string script)
        {
            Runspace runspace = RunspaceFactory.CreateRunspace();
            runspace.Open();
            Pipeline pipeline = runspace.CreatePipeline();
            pipeline.Commands.AddScript(script);
            pipeline.Commands.Add("Out-String");
            Collection<PSObject> results = pipeline.Invoke();
            runspace.Close();
            StringBuilder stringBuilder = new StringBuilder();
            foreach (PSObject pSObject in results)
                stringBuilder.AppendLine(pSObject.ToString());
            return stringBuilder.ToString();
        }

将 powershell 命令调用到运行空间(您可以将此代码放在按钮单击或其他位置):

_ = RunScript("Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq 
$False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | Select- 
Object -Property "sAMAccountName",@{Name="ExpiryDate";Expression= 
{[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}");

然后使用“Out-String”将输出通过管道传输到数据网格视图。


推荐阅读