Get-LocalGroups (modification of post by view diff)
View followups from tojo2000 | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/1267"></script>download | new post
I import this as a module because it depends on the other two functions. You could easily dot-source it as well. Requires v2 CTP3 or higher to get the help documentation to work.
- function Add-NoteProperty {
- <#
- .Synopsis
- Adds a NoteProperty member to an object.
- .Description
- This function makes adding a property a lot easier than Add-Member, assuming
- you want to add a NoteProperty, which I find is true about 90% of the time.
- .Parameter object
- The object to add the property to.
- .Parameter name
- The name of the new property.
- .Parameter value
- The object to add as the property.
- .Example
- # Create a new custom object and add some properties.
- PS> $custom_obj = New-Object PSObject
- PS> Add-NoteProperty $custom_obj Name 'Custom'
- PS> Add-NoteProperty $custom_obj Value 42
- .Example
- # Add a NoteProperty by passing the object to be modified down the pipeline.
- PS> $bunch_of_objects | Add-NoteProperty -name 'meaning_of_life' -value 42
- .Notes
- NAME: Add-NoteProperty
- AUTHOR: Tim Johnson <tojo2000@tojo200.com>
- FILE: LocalGroups.psm1
- #>
- param([Parameter(Mandatory = $true,
- ValueFromPipeline = $true,
- Position = 0)]
- $object,
- [Parameter(Mandatory = $true,
- Position = 1)]
- [string]$name,
- [Parameter(Mandatory = $true,
- Position = 2)]
- $value)
- BEGIN{}
- PROCESS{
- $object | Add-Member -MemberType NoteProperty `
- -Name $name `
- -Value $property
- }
- END{}
- }
- function Get-COMProperty{
- <#
- .Synopsis
- Gets a property of a __ComObject object.
- .Description
- This function calls the InvokeMember static method of the class to get
- properties that aren't directly exposed to PowerShell, such as local group
- members found by calling Members() on a DirectoryServices group object.
- .Parameter com_object
- The object to retrieve the property from.
- .Parameter property_name
- The name of the property.
- .Example
- # Get the names of all members of a group.
- PS> [adsi]$computer = 'WinNT://servername'
- PS> $groups = $groups = $computer.psbase.children |
- >> ?{$_.psbase.schemaclassname -eq 'group'}
- PS> $groups[0].Members() | %{Get-COMProperty $_ 'Name'}
- .Notes
- NAME: Get-COMProperty
- AUTHOR: Tim Johnson <tojo2000@tojo200.com>
- FILE: LocalGroups.psm1
- #>
- param([Parameter(Mandatory = $true,
- Position = 1)]
- $com_object,
- [Parameter(Mandatory = $true,
- Position = 2)]
- [string]$property_name)
- [string]$property = $com_object.GetType().InvokeMember($property_name,
- 'GetProperty',
- $null,
- $com_object,
- $null)
- Write-Output $property
- }
- function Get-LocalGroups{
- <#
- .Synopsis
- Gets a list of objects with information about local groups and their members.
- .Description
- This function returns a list of custom PSObjects that are a list of local
- groups on a computer. Each object has a property called Members that is a
- list of PSObjects representing each member, with Name, Domain, and ADSPath.
- .Parameter computername
- The object to retrieve the property from.
- .Example
- # Get a list of groups from a server.
- PS> Get-LocalGroups servername
- .Notes
- NAME: Get-LocalGroups
- AUTHOR: Tim Johnson <tojo2000@tojo200.com>
- FILE: LocalGroups.psm1
- #>
- param([Parameter(Mandatory = $true,
- ValueFromPipeline = $true)]
- [string]$computername = $env:computername)
- BEGIN{}
- PROCESS{
- $output = @()
- [adsi]$computer = "WinNT://$computername"
- $groups = $computer.psbase.children |
- ?{$_.psbase.schemaclassname -eq 'group'}
- foreach ($group in $groups) {
- $members = @()
- $grp_obj = New-Object PSObject
- Add-NoteProperty $grp_obj 'Name' $group.Name.ToString()
- Add-NoteProperty $grp_obj 'aDSPath' $group.aDSPath.ToString()
- foreach ($user in $group.Members()){
- $usr_obj = New-Object PSObject
- Add-NoteProperty $usr_obj 'aDSPath' (Get-COMProperty $user 'aDSPath')
- Add-NoteProperty $usr_obj 'Name' (Get-COMProperty $user 'Name')
- $path = $usr_obj.aDSPath.split('/')
- if ($path.Count -eq 4){
- Add-NoteProperty $usr_obj 'Domain' $path[2]
- }elseif ($path.Count -eq 5) {
- Add-NoteProperty $usr_obj 'Domain' $path[3]
- }else{
- Add-NoteProperty $usr_obj 'Domain' 'Unknown'
- }
- $members += $usr_obj
- }
- Add-NoteProperty $grp_obj 'Members' $members
- Write-Output $grp_obj
- }
- }
- END{}
- }
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.
PowerShell Code Repository