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