繁体   English   中英

尝试使用Powershell在活动目录中的OU中查找计算机,以查看它们是否为特定软件

[英]trying to use Powershell to look in an OU in active directory for computers to see if they specific software

我对PowerShell还是很陌生,并且仍在学习如何使用它。 我看到我可以使用一个名为Get-WmiObject的cmdlet,但是我不确定这是正确的选择。 我见过有人说使用它时,它可能会在用户端引发错误,这会使用户感到困惑。

因此,闲逛的人们说我可以在OU中查询所有计算机的注册表,该注册表将在此处搜索“ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall”,并可能在此处搜索“ SOFTWARE \\ Wow6432Node \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall” ”。 我遇到的问题是我不确定要开始使用哪个cmdlet(如果根本没有cmdlet),如何告诉它在特定注册表中进行搜索,同时还告诉它要通过OU中的每台计算机?检查。

我需要搜索所有安装了“ Microsoft Office”的计算机。 谁能指出我正确的方向? 我该怎么做呢?

首先,您需要在OU中获取计算机名称的列表,为此,您需要获取该OU的DistinghuishedName属性。 (在ADUC中-> OU属性->属性-> DistinghuishedName中查找)

使用该功能,您可以使用下面的功能测试已安装的软件:

function Get-InstalledSoftware {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
        [string[]]$ComputerName = $env:COMPUTERNAME,

        [string]$NamePattern = '*',

        [switch]$ExcludeUpdates
    )
    begin {
        $UninstallPaths = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\',
                          'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'
    }
    process {
        foreach ($computer in $ComputerName) {
            if ([string]::IsNullOrEmpty($computer) -or $computer -eq '.') { $computer = $env:COMPUTERNAME }

            # if the computername is its SamAccountName, it ends in a dollar sign.
            $computer = $computer -replace '\$$', ''

            if (!(Test-Connection -ComputerName $computer -Count 1 -Quiet)) {
                Write-Warning "Computer '$computer' cannot be reached."
                continue
            }

            $system  = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computer
            $baseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$computer)
            foreach ($regPath in $UninstallPaths) {
                $key = $baseKey.OpenSubKey($regPath)
                # if the key exists
                if ($key) {
                    $key.GetSubKeyNames() | ForEach-Object {
                        $subKey      = $baseKey.OpenSubKey("$regPath$_")
                        $application = $subKey.GetValue('DisplayName')
                        if (($application) -and ($application -like $NamePattern)) {
                            if (!$ExcludeUpdates -or ($application -notlike "*update*")) {
                                [PSCustomObject]@{
                                    'Computer'        = $system.Name
                                    'Application'     = $application
                                    'Version'         = $subKey.GetValue('DisplayVersion')
                                    'InstallLocation' = $subKey.GetValue('InstallLocation')
                                    'UninstallString' = $subKey.GetValue('UninstallString')
                                    'Publisher'       = $subKey.GetValue('Publisher')
                                    'LoggedOnUser'    = $system.UserName
                                }
                            }
                        }
                        # close $subKey
                        if ($subKey)  { $subKey.Close() }
                    }
                    # close $key
                    if ($key)  { $key.Close() }
                }
            }
            # close $baseKey
            if ($baseKey)  { $baseKey.Close() }
        }
    }
}

注意:如果您具有PowerShell 3.0或更高版本,则可以将行$system = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computer $system = Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName $computer -Verbose:$false$system = Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName $computer -Verbose:$false这将执行快点

像这样使用它:

Import-Module ActiveDirectory

$OuDn = 'DistinghuishedName of the OU you are interested in'

# get a list of computer names in the given OU
$computers = Get-ADComputer -Filter * -SearchBase $OuDn | Select-Object -ExpandProperty Name

# use the function to get a list of installed applicationa
$software = Get-InstalledSoftware -ComputerName $computers -NamePattern "Microsoft Office*" -ExcludeUpdates

# output to console or export to a CSV file
$software | Export-Csv -Path 'D:\software.csv' -NoTypeInformation -Encoding UTF8

注意:此功能可以在您的PC上完成所有工作,因此必须确保以具有读取所有计算机上注册表项权限的用户身份运行它。

另外,为了远程打开密钥,服务器和客户端计算机都必须正在运行远程注册表服务 ,并且启用了远程管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM