Functions: Get-LocalAdminGroupMembership and Set-LocalAdminGroupMembership – Local Admin Group Membership on Remote Machines
While writing some PowerShell scripts to automate the installation of Exchange on over 100 servers, I needed to set and then verify that a group (in this case, “Exchange Trusted Subsystem”) was a member of the local admins group on some remote servers.
We start with Get-LocalAdminGroupMembership. This function merely checks the local admins group on a remote server to see if the group to be added is already a member. If it is, it returns $true, if not, $false. We need to pass it two variables: $ComputerName, and $Member. We don’t need to run this function. It’s called from the second function.
function Get-LocalAdminGroupMembership { [CmdletBinding()] Param( [Parameter(Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] $ComputerName = ".", [Parameter(Position=1, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] $Member ) if($ComputerName -eq "."){$ComputerName = (get-WmiObject win32_computersystem).Name} $computer = [ADSI]("WinNT://" + $ComputerName + ",computer") $Group = $computer.psbase.children.find("Administrators") $members= $Group.psbase.invoke("Members") | % {$_.GetType().InvokeMember("Name", "GetProperty", $null, $_, $null)} if ($members -match $member){return $true}else{return $false} } # end function Get-LocalAdminGroupMembership
The second function does all the heavy lifting.
function Set-LocalAdminGroupMembership { [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string]$ComputerName = ".", [Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string]$Member, [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string]$Domain = $env:USERDNSDOMAIN ) Process{ if (!(Get-LocalAdminGroupMembership -ComputerName "$ComputerName" -Member "$Member")){ if($ComputerName -eq "."){$ComputerName = $env:ComputerName.ToUpper()} if($Domain){ $adsi = [ADSI]"WinNT://$ComputerName/administrators,group" $adsi.Add("WinNT://$Domain/$Member,group") }else{ Write-Host "Not connected to a domain." -ForegroundColor "red" } } else { Write-Host "`"$Account`" is already a local admin on $ComputerName" -ForegroundColor yellow } Get-LocalAdminGroupMembership -ComputerComputer "$ComputerName" -Member "$Member" }# Process } # end function Set-LocalAdminGroupMembership
We call Set-LocalAdminGroupMembership and pass it the same parameters, $ComputerName and $Member
Set-LocalAdminGroupMembership -ComputerName mycomputer -Member "Exchange Trusted Subsystem"
The function will add the group to the local admins group, and then do a Get-LocalAdminGroupMembership for that same group and dump the results to the screen.
Follow Me