缺少AD模块并且无法获取它,需要类似的东西来模拟它

时间:2016-12-28 15:47:48

标签: powershell active-directory updates

因此,我尝试为服务器上的所有计算机输出完整的KB列表(可在一台计算机上运行),但它不会将Get-ADcomputer识别为cmdlet。检查各种信号源时,似乎不包含AD模块。当我在工作计算机/服务器上这样做时,我不愿下载任何或任何性质的东西。

有没有什么方法可以在不使用AD模块的情况下实现以下目的,或者我可能会错过如何导入模块(如果存在,我认为它不会在这个系统上执行)?

# 1. Define credentials
$cred = Get-Credential
# 2. Define a scriptblock
$sb = {
    $Session = New-Object -ComObject Microsoft.Update.Session
    $Searcher = $Session.CreateUpdateSearcher()
    $HistoryCount = $Searcher.GetTotalHistoryCount()

    $Searcher.QueryHistory(0,$HistoryCount) | ForEach-Object -Process {
        $Title = $null
        if ($_.Title -match "\(KB\d{6,7}\)") {
            # Split returns an array of strings
            $Title = ($_.Title -split '.*\((?<KB>KB\d{6,7})\)')[1]
        } else {
            $Title = $_.Title
        }

        $Result = $null
        switch ($_.ResultCode) {
            0 { $Result = 'NotStarted'}
            1 { $Result = 'InProgress' }
            2 { $Result = 'Succeeded' }
            3 { $Result = 'SucceededWithErrors' }
            4 { $Result = 'Failed' }
            5 { $Result = 'Aborted' }
            default { $Result = $_ }
        }
        New-Object -TypeName PSObject -Property @{
            InstalledOn = Get-Date -Date $_.Date;
            Title = $Title;
            Name = $_.Title;
            Status = $Result
        }
    } | Sort-Object -Descending:$false -Property InstalledOn | Where {
        $_.Title -notmatch "^Definition\sUpdate"
    }
}

#Get all servers in your AD (if less than 10000)
Get-ADComputer -ResultPageSize 10000 -SearchScope Subtree -Filter {
    (OperatingSystem -like "Windows*Server*")
} | ForEach-Object {
    # Get the computername from the AD object
    $computer = $_.Name
    # Create a hash table for splatting
    $HT = @{
        ComputerName = $computer ;
        ScriptBlock = $sb ;
        Credential = $cred;
        ErrorAction = "Stop";
    }
    # Execute the code on remote computers
    try {
        Invoke-Command @HT
    } catch {
        Write-Warning -Message "Failed to execute on $computer because $($_.Exception.Message)"
    }
} | Format-Table PSComputerName,Title,Status,InstalledOn,Name -AutoSize

2 个答案:

答案 0 :(得分:2)

您有3个选择:

  • 首先是安装AD的RSAT功能,其中包括AD模块。这可能是最好的选择,除非有特定的东西阻止它。如果您从客户端操作系统运行脚本,则需要先安装RSAT

  • 选项2(仅在添加Windows功能时才应该使用)是下载并使用Quest AD工具,它们提供非常相似的功能,但看起来戴尔正在尽力做到现在隐藏这些可能很难找到......

  • 选项3是使用.NET ADSI类直接访问AD,无需在任何能够运行PowerShell的系统上进行任何额外下载。如果您想要使用此路线,请查看界面HereSystem.DirectoryServices命名空间Here的文档。

修改

刚刚注意到问题的最后一部分,你是什么意思&#34;一个完整的KB列表&#34;?不只是Windows更新或手动更新的东西? Windows更新列表中还有哪些内容不是Windows更新?

答案 1 :(得分:0)

您还没有提到您正在使用的操作系统,但一般情况下,如果您拥有服务器2008 R2或更高版本,您只需要激活RSAT功能AD PowerShell模块就可以获得您正在寻找的cmdlet。 / p>

在客户端计算机上,您必须&#39;安装RSAT,然后激活功能。您可以查看technet文章了解更多信息:https://technet.microsoft.com/en-us/library/ee449483(v=ws.10).aspx

如果您不想使用该选项,则必须使用.NET ADSI类。关于如何做到这一点有很多例子,它基本上归结为几行。 Technet也有这方面的例子:https://technet.microsoft.com/en-us/library/ff730967.aspx