【问题标题】:ADSI query running well on some boxes and failing on othersADSI 查询在某些盒子上运行良好,而在其他盒子上则失败
【发布时间】:2018-04-19 14:18:45
【问题描述】:

我正在为客户编写一个 PowerShell 脚本,以便在服务器退役之前从服务器中提取信息。我不得不跳过几个环节,因为他们有 2008 甚至一些 2003 服务器,它们并不总是支持相同的 Get-CimInstance 查询,但在大多数情况下它按预期工作。但是,我还无法修复的一个部分是提取所有本地组及其成员的列表,如下所示:

            $localGroups = Invoke-Command -ScriptBlock {
                [ADSI]$S = "WinNT://$($env:computername)"
                $S.children.Where({$_.class -eq 'group'}) |
                    Select @{Name="Name";Expression={$_.name.value}},
                           @{Name="Members";Expression={
                                [ADSI]$group = "$($_.Parent)/$($_.Name),group"
                                $members = $Group.psbase.Invoke("Members")
                                ($members | ForEach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -join ";"
                           }
                           }
                } -ComputerName $sPC | Select PSComputername,Name,Members

这在 Server 2012 及更高版本上运行良好,但在 2008 及更低版本上失败。具体错误状态:

方法调用失败,因为 [System.DirectoryServices.DirectoryEntries] 不包含名为“Where”的方法

所以操作系统不喜欢 $S.Children.Where() 调用。只是好奇是否有人知道另一种格式化它以供 2008 年及更早版本使用的方法。我可能会走旧的 WMI 调用路线,但这需要很长时间才能完成。

【问题讨论】:

    标签: powershell powershell-v6.0


    【解决方案1】:

    我最终找到了一种(相当)快速的方法,适用于所有操作系统:

    function get-groups {
       param ($strcomputer)
       $groups = gwmi win32_group -ComputerName $strcomputer
       return $groups
    }
    
    function Get-LocalGroupMembers { 
       param( 
       [parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] 
        [Alias("Name")] 
        [string]$ComputerName, 
        [string]$GroupName = "Administrators" 
       ) 
    
    begin {} 
    
    process { 
        $ComputerName = $ComputerName.Replace("`$", '') 
        $arr = @() 
        $wmi = Get-WmiObject -ComputerName $ComputerName -Query "SELECT * FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$ComputerName',Name='$GroupName'`"" 
            if ($wmi -ne $null)  { 
                foreach ($item in $wmi) { 
                    $arr += ($item.PartComponent.Substring($item.PartComponent.IndexOf(',') + 1).Replace('Name=', '').Replace("`"", '')) 
                } 
            } 
    
        $hash = @{ComputerName=$ComputerName;Members=$arr} 
        return $hash 
    } 
    
    end{} 
    }
    
    $sPC = "Server2008R2"
    $a = 1
    $adapterInfo = Get-CimInstance -query "Select * From 
    Win32_NetworkAdapterConfiguration Where IPenabled = 'TRUE'" -ComputerName $sPC
    $serialNumber = Get-CimInstance -query "Select * From Win32_Bios" -ComputerName $sPC
    $shares = Get-CimInstance -query "Select * From Win32_Share" -ComputerName $sPC
    
    $localGroups = get-groups $sPC
    $myObject = New-Object -TypeName PSObject
    
    $myObject | Add-Member -MemberType NoteProperty -Name ComputerName -Value $adapterInfo.PSComputerName
    $myObject | Add-Member -MemberType NoteProperty -Name Description -Value $adapterInfo.Description
    
    $adapterInfo | ForEach-Object {
       $_.IPAddress |
          ForEach-Object {
             $myObject | Add-Member -MemberType NoteProperty -Name "IPAddress$($a)" -Value $_
             $a++
          }
    }
    
    $myObject | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $serialNumber.SerialNumber
    
    foreach ($share in $shares) {
       if ($share.Name -ne "C$" -and
           $share.Name -ne "D$" -and 
           $share.Name -ne "ADMIN$" -and 
           $share.Name -ne "IPC$") {
              $myObject | Add-Member -MemberType NoteProperty -Name "Share $($share.Name)" -Value $share.Path
        }   
    }
    
    foreach ($group in $localGroups) {
       $members = ((Get-LocalGroupMembers -ComputerName $sPC -GroupName $group.Name).Members) -join "; "
          if ($members.Length -ne 0) {
             $myObject | Add-Member -MemberType NoteProperty -Name "$($group.Name) Members" -Value $members
          }
    }
    
    $myObject | Export-Csv -Path "<Path  to Folder>\$($sPC).csv" -NoTypeInformation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多