Private/Get-AdObjectType.ps1
function Get-AdObjectType { <# .SYNOPSIS Retrieves the type of an Active Directory object based on the provided identity. .DESCRIPTION The Get-AdObjectType function determines the type of an Active Directory object based on the given identity. It supports various object types, including AD users, computers, groups, organizational units, and group managed service accounts. The function can handle different input formats such as AD objects, DistinguishedName, SamAccountName, SID, and GUID. It also includes support for Well-Known SIDs. .PARAMETER Identity Specifies the identity of the Active Directory object. This parameter is mandatory. Accepted values: - ADAccount object - ADComputer object - ADGroup object - ADOrganizationalUnit object - ADServiceAccount object - String representing DistinguishedName - String representing SID (including Well-Known SIDs) - String representing samAccountName (including Well-Known SID name) - String representing GUID .EXAMPLE Get-AdObjectType -Identity "davader" Retrieves the type of the Active Directory object with the SamAccountName "davader". .EXAMPLE Get-AdObjectType -Identity "CN=davade,OU=Users,OU=BAAD,OU=Sites,DC=EguibarIT,DC=local" Retrieves the type of the Active Directory object with the DistinguishedName "CN=davade,OU=Users,OU=BAAD,OU=Sites,DC=EguibarIT,DC=local". .EXAMPLE Get-AdObjectType -Identity "S-1-5-21-3484526001-1877030748-1169500100-1646" Retrieves the type of the Active Directory object with the SID "S-1-5-21-3484526001-1877030748-1169500100-1646". .EXAMPLE Get-AdObjectType -Identity "35b764b7-06df-4509-a54f-8fd4c26a0805" Retrieves the type of the Active Directory object with the GUID "35b764b7-06df-4509-a54f-8fd4c26a0805". .OUTPUTS Microsoft.ActiveDirectory.Management.ADAccount or Microsoft.ActiveDirectory.Management.ADComputer or Microsoft.ActiveDirectory.Management.ADGroup or Microsoft.ActiveDirectory.Management.ADOrganizationalUnit or Microsoft.ActiveDirectory.Management.ADServiceAccount .NOTES Version: 1.3 DateModified: 2/Oct/2024 LasModifiedBy: Vicente Rodriguez Eguibar vicente@eguibar.com Eguibar Information Technology S.L. http://www.eguibarit.com #> [CmdletBinding(SupportsShouldProcess = $false, ConfirmImpact = 'low')] [OutputType( [Microsoft.ActiveDirectory.Management.ADAccount], [Microsoft.ActiveDirectory.Management.ADComputer], [Microsoft.ActiveDirectory.Management.ADGroup], [Microsoft.ActiveDirectory.Management.ADOrganizationalUnit], [Microsoft.ActiveDirectory.Management.ADServiceAccount]) ] Param ( # Param1 [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, ValueFromRemainingArguments = $false, HelpMessage = 'Identity of the object', Position = 0)] [ValidateNotNullOrEmpty()] [Alias('ID', 'SamAccountName', 'DistinguishedName', 'DN', 'SID', 'GUID')] $Identity ) Begin { $txt = ($Variables.HeaderHousekeeping -f (Get-Date).ToShortDateString(), $MyInvocation.Mycommand, (Get-FunctionDisplay -HashTable $PsBoundParameters -Verbose:$False) ) Write-Verbose -Message $txt ############################## # Module imports Import-MyModule -Name 'ActiveDirectory' -Verbose:$false ############################## # Variables Definition $ReturnValue = $null $newObject = $null } # End Begin Section Process { try { # Known Identities OR AD Objects if ( $Identity -is [Microsoft.ActiveDirectory.Management.ADAccount] -or $Identity -is [Microsoft.ActiveDirectory.Management.ADComputer] -or $Identity -is [Microsoft.ActiveDirectory.Management.ADGroup] -or $Identity -is [Microsoft.ActiveDirectory.Management.ADOrganizationalUnit] -or $Identity -is [Microsoft.ActiveDirectory.Management.ADServiceAccount] ) { Write-Verbose -Message (' ┝━━━━━━► Known AD Object Type: {0}' -f $Identity.GetType().Name) $ReturnValue = $Identity } elseif ($Identity -is [string]) { Write-Verbose -Message ('Identity is a string: {0}. Trying to resolve it!' -f $Identity) # Check if it's a well-known SID name (including Foreign Security Principals) $sid = Test-NameIsWellKnownSid -Name $Identity if ($sid) { Write-Verbose -Message ('Found well-known SID for name: {0}. Returning SecurityIdentifier object.' -f $Identity) $ReturnValue = $sid } else { if (Test-IsValidDN -ObjectDN $Identity) { Write-Verbose -Message 'Looking for DistinguishedName' $newObject = Get-ADObject -Filter { DistinguishedName -like $Identity } } elseif (Test-IsValidSID -ObjectSID $Identity) { Write-Verbose -Message 'Looking for ObjectSID' $newObject = Get-ADObject -Filter { ObjectSID -like $Identity } } elseif (Test-IsValidGUID -ObjectGUID $Identity) { Write-Verbose -Message 'Looking for ObjectGUID' $newObject = Get-ADObject -Filter { ObjectGUID -like $Identity } } else { Write-Verbose -Message 'Looking for SamAccountName' $newObject = Get-ADObject -Filter { (Name -like $identity) -or (SamAccountName -like $identity) } } #end If-ElseIf-Else } #end If WellKnownSid } #end If-ElseIf Identity } Catch { throw ('Unsupported Identity type: {0}' -f $Identity.GetType().Name) return $null } #end If-ElseIf-Else If ($newObject -and (-not $ReturnValue)) { # once we have the object, lets get it from AD Switch ($newObject.ObjectClass) { 'user' { Write-Verbose -Message '# ┝━━━━━━━━━━► AD User Object from STRING' [Microsoft.ActiveDirectory.Management.ADAccount]$ReturnValue = Get-ADUser -Identity $newObject } 'group' { Write-Verbose -Message '# ┝━━━━━━━━━━► AD Group Object from STRING' [Microsoft.ActiveDirectory.Management.AdGroup]$ReturnValue = Get-ADGroup -Identity $newObject } 'computer' { Write-Verbose -Message '# ┝━━━━━━━━━━► AD Computer Object from STRING' [Microsoft.ActiveDirectory.Management.ADComputer]$ReturnValue = Get-ADComputer -Identity $newObject } 'organizationalUnit' { Write-Verbose -Message '# ┝━━━━━━━━━━► AD Organizational Unit Object from STRING' [Microsoft.ActiveDirectory.Management.organizationalUnit]$ReturnValue = Get-ADOrganizationalUnit -Identity $newObject } 'msDS-GroupManagedServiceAccount' { Write-Verbose -Message '# ┝━━━━━━━━━━► AD Group Managed Service Account from STRING' [Microsoft.ActiveDirectory.Management.ADServiceAccount]$ReturnValue = Get-ADServiceAccount -Identity $newObject } Default { Write-Error -Message ('# ┝━━━━━━━━━━► Unknown object type for identity: {0}' -f $Identity) return $null } } # End Switch } #end If } # End Process Section End { $txt = ($Variables.FooterHousekeeping -f $MyInvocation.InvocationName, 'getting AD object type (Private Function).' ) Write-Verbose -Message $txt if ($null -ne $ReturnValue) { Write-Output $ReturnValue } #end If } # End End Section } #end Function |