Извлечение пользователей домена из локальных групп с powershell - PullRequest
0 голосов
/ 30 мая 2018

Я хочу мигрировать с одного сервера на другой, и поэтому необходимо добавить несколько локальных групп на новый сервер.В этих локальных группах добавленные пользователи принадлежат домену.

Пример:

          Server           | Members

---------------------------|------------------

Server\Group1              | Domain\User1, Domain\User2
Server\Group2              | Domain\User2, Domain\User3

Следующая ссылка https://www.petri.com/use-powershell-to-find-local-groups-and-members, кажется, решает эту проблему, но я получаю неожиданноерезультат

Это сценарий PowerShell

# set variables
$server = $env:COMPUTERNAME
$localgroup = "Administrators"
$Group= [ADSI]"WinNT://$Server/$LocalGroup,group"

# get users name
$members = $Group.psbase.Invoke("Members")
$members | ForEach-Object 
{ 
    $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) 
}

Get-WMIObject win32_group -filter "LocalAccount='True'" -computername $Server | Select PSComputername,Name,@{Name="Members";Expression={$_.GetRelated("Win32_UserAccount").Name -join ";"}}

Показанный вывод состоит из двух столбцов (хотя это должно быть 3, но PSComputerName не отображается, когда столбец Члены пуст)

1 Ответ

0 голосов
/ 30 мая 2018

Ну, вот как я добился вывода, а также экспортировал его в * .csv файл

# set variables
$server = $env:COMPUTERNAME

$tableOutput = New-Object System.Collections.ArrayList

# get members
Function Get-Members($groupName){
    $testgroup = [ADSI]"WinNT://$Server/$tmpGroupName,group"
    $members = New-Object System.Collections.ArrayList
    $testgroup.psbase.Invoke("Members") | ForEach-Object{
    $searchFilter = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) -replace "\."," "
        $tmpUser = Get-ADUser -Filter {(Name -like $searchFilter) -or (SamAccountName -like $searchFilter)}
        if($tmpUser){
            [void]$members.Add($tmpUser.UserPrincipalName)
        }
    }       
    $members
}

Get-WMIObject win32_group -Filter { (LocalAccount='True') } -computername $Server | ForEach-Object{         
    $tmpGroup = $_ 

    # get data
    $tmpGroupName = $tmpGroup.Name
    $members = Get-Members($tmpGroupName)             
    $tmpGroupDescription = $tmpGroup.Description        

    # save into object        
    $groupObject = New-Object -TypeName PSObject
    $groupObject | Add-Member -MemberType NoteProperty -Name GroupName -Value $tmpGroupName
    $groupObject | Add-Member -MemberType NoteProperty -Name GroupDescription -Value $tmpGroupDescription
    $groupObject | Add-Member -MemberType NoteProperty -Name UsersList -Value $members      

    [void]$tableOutput.Add($groupObject)
}

$tableOutput | Select GroupName, GroupDescription, @{Name='Users';Expression={$_.UsersList -join ','}} | Export-CSV -Path 'C:\test\users.csv' -Delimiter ';' -NoTypeInformation

Любая поправка будет приветствоваться.

...