Skip to content

Instantly share code, notes, and snippets.

@MVKozlov
Created May 17, 2017 12:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MVKozlov/6721df45779b102a1adcaf04378c83a0 to your computer and use it in GitHub Desktop.
Save MVKozlov/6721df45779b102a1adcaf04378c83a0 to your computer and use it in GitHub Desktop.
function Set-LocalGroupMember {
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
param(
[Parameter(ValueFromPipeline=$true, Position=0)]
[string[]]$ComputerName = '.',
[Parameter(ValueFromPipeline=$false, Position=1)]
[string[]]$GroupName = 'Administrators',
[Parameter(ValueFromPipeline=$false, Position=2)]
[string]$Member,
[Parameter(Mandatory=$true, ParameterSetName='remove')]
[switch]$Remove,
[Parameter(Mandatory=$true, ParameterSetName='add')]
[switch]$Add
)
BEGIN {
$Domain, $User = $Member -split '\\'
if (-Not $User) {
$User = $Domain
$Domain = $env:USERDOMAIN
}
$Member = ('{0}/{1}' -f $Domain.ToUpper(), $User)
$MemberADSI = [ADSI]"WinNT://$Member,user"
if (-Not $MemberADSI.Path) {
throw "Can't find $Member ($Domain/$User)"
}
Write-Verbose ('User: ' + $MemberADSI.Path) # test for existance
}
PROCESS {
foreach ($computer in $ComputerName) {
foreach ($group in $GroupName) {
$grp =[ADSI]"WinNT://$computer/$group,group"
Write-Verbose ('Group: ' + $grp.Path) # test for existance
if ($Add) {
if ($PSCmdlet.ShouldProcess($computer, "Add $Member to $group")) {
Write-Verbose "Adding $Member to $group @ $computer"
$grp.Add($MemberADSI.Path)
}
}
else {
if ($PSCmdlet.ShouldProcess($computer, "Remove $Member from $group")) {
Write-Verbose "Removing $Member from $group @ $computer"
$grp.Remove($MemberADSI.Path)
}
}
}
}
}
}
function Add-LocalGroupMember {
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
param(
[Parameter(ValueFromPipeline=$true, Position=0)]
[string[]]$ComputerName = '.',
[Parameter(ValueFromPipeline=$false, Position=1)]
[string[]]$GroupName,
[Parameter(ValueFromPipeline=$false, Position=2)]
[string]$Member
)
BEGIN {
$PSBoundParameters.Add('Add', $true)
$list = New-Object System.Collections.ArrayList
}
PROCESS {
[void]$List.Add($ComputerName)
}
END {
$PSBoundParameters['ComputerName'] = [array]$List
Set-LocalGroupMember @PSBoundParameters
}
}
function Remove-LocalGroupMember {
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
param(
[Parameter(ValueFromPipeline=$true, Position=0)]
[string[]]$ComputerName = '.',
[Parameter(ValueFromPipeline=$false, Position=1)]
[string[]]$GroupName,
[Parameter(ValueFromPipeline=$false, Position=2)]
[string]$Member
)
BEGIN {
$PSBoundParameters.Add('Remove', $true)
$list = New-Object System.Collections.ArrayList
}
PROCESS {
[void]$List.Add($ComputerName)
}
END {
$PSBoundParameters['ComputerName'] = [array]$List
Set-LocalGroupMember @PSBoundParameters
}
}
function Get-LocalGroupMember {
param(
[Parameter(ValueFromPipeline=$true)]
[string[]]$ComputerName = '.',
[Parameter(ValueFromPipeline=$false)]
[string[]]$GroupName = 'Administrators'
)
<#
Get-WMIObject win32_group -filter "LocalAccount='True'" -computername $Server |
Select PSComputername,Name,@{Name="Members";Expression={
$_.GetRelated("win32_useraccount").Name -join ";"
}}
Get-CimInstance win32_group -filter "LocalAccount='True'" -computername $Server |
Select PSComputername,Name,@{Name="Members";Expression={
(Get-CimAssociatedInstance -InputObject $_ -ResultClassName Win32_UserAccount).Name -join ";"
}}
to find local admin group name:
$objSID = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-544")
$objgroup = $objSID.Translate( [System.Security.Principal.NTAccount])
$objgroupname = ($objgroup.Value).Split("\")[1]
#>
PROCESS {
foreach ($computer in $ComputerName) {
foreach ($group in $GroupName) {
$grp = [ADSI]"WinNT://$computer/$group,group"
Write-Verbose ('Group: ' + $grp.Path) # test for existance
$members = @($grp.psbase.Invoke("Members"))
$members | Foreach-Object {
$name = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
$class = $_.GetType().InvokeMember("Class", 'GetProperty', $null, $_, $null)
$parent = $_.GetType().InvokeMember("Parent", 'GetProperty', $null, $_, $null) -replace 'WinNT://' -replace '.*/'
'' | Select-Object @{n='Class';e={$class}},@{n='Domain';e={$parent}},@{n='Name';e={$name}}
}
}
}
}
}
function Get-LocalGroup {
param(
[Parameter(ValueFromPipeline=$true)]
[string[]]$ComputerName = '.'
)
PROCESS {
foreach ($computer in $ComputerName) {
$comp = [ADSI]"WinNT://$computer"
Write-Verbose ('Computer: ' + $comp.Path) # test for existance
$comp.psbase.CHildren | Where-Object { $_.SchemaClassName -eq 'group' } | Select-Object -ExpandProperty Name
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment