0

I copied the PowerShell code from this site that displays the local user accounts for the computers that I want to search in my domain.

I edited it a bit to the following to show NOT_FOUND if that PC is turned off or just can't find it:

Param
(
    [Parameter(Position=0,Mandatory=$false)]
    [ValidateNotNullorEmpty()]
    [Alias('cn')][String[]]$ComputerName=$Env:COMPUTERNAME,
    [Parameter(Position=1,Mandatory=$false)]
    [Alias('un')][String[]]$AccountName,
    [Parameter(Position=2,Mandatory=$false)]
    [Alias('cred')][System.Management.Automation.PsCredential]$Credential
)
    
$Obj = @()

Foreach($Computer in $ComputerName)
{

    If($Credential)
    {
        $AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" `
        -Filter "LocalAccount='$True'" -ComputerName $Computer -Credential $Credential -ErrorAction SilentlyContinue
    }
    else
    {
        
        $AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" `
        -Filter "LocalAccount='$True'" -ComputerName $Computer  -ErrorAction SilentlyContinue -ErrorVariable NotFound
    }

    If ($NotFound) {
        
        $Object = New-Object -TypeName PSObject

        $Object|Add-Member -MemberType NoteProperty -Name "Name" -Value "NOT_FOUND"
        $Object|Add-Member -MemberType NoteProperty -Name "Disabled" -Value "TRUE"
        $Object|Add-Member -MemberType NoteProperty -Name "Domain" -Value $Computer
        $Obj+=$Object
        $NotFound = $null
    }
    else{
        Foreach($LocalAccount in $AllLocalAccounts)
        {
            $Object = New-Object -TypeName PSObject
        
            $Object|Add-Member -MemberType NoteProperty -Name "Name" -Value $LocalAccount.Name
            $Object|Add-Member -MemberType NoteProperty -Name "Disabled" -Value $LocalAccount.Disabled
            $Object|Add-Member -MemberType NoteProperty -Name "Domain" -Value $LocalAccount.Domain
            $Obj+=$Object
        }
    }
    If($AccountName)
    {
        Foreach($Account in $AccountName)
        {
            $Obj|Where-Object{$_.Name -like "$Account"}
        }
    }
    else
    {
        $Obj
    }
}

I enter the following:

.\GetLocalAccount.ps1  -Computername "Comp1", "Comp2", "Comp3", "Comp4"

The problem is that the output seems to be duplicating. I've tried debugging in ISE and don't see this in the $obj variable.

My Output is the following:

Name               Disabled Domain      
----               -------- ------      
Administrator         False Comp1
DefaultAccount         True Comp1
Guest                  True Comp1
WDAGUtilityAccount     True Comp1
Administrator         False Comp1
DefaultAccount         True Comp1
Guest                  True Comp1
WDAGUtilityAccount     True Comp1
NOT_FOUND              TRUE Comp2
Administrator         False Comp1
DefaultAccount         True Comp1
Guest                  True Comp1
WDAGUtilityAccount     True Comp1
NOT_FOUND              TRUE Comp2
NOT_FOUND              TRUE Comp3   
Administrator         False Comp1
DefaultAccount         True Comp1
Guest                  True Comp1
WDAGUtilityAccount     True Comp1
NOT_FOUND              TRUE Comp2
NOT_FOUND              TRUE Comp3   
Administrator         False Comp4
DefaultAccount         True Comp4
Guest                  True Comp4
WDAGUtilityAccount     True Comp4

The Output should be:

Name               Disabled Domain      
----               -------- ------      
Administrator         False Comp1
DefaultAccount         True Comp1
Guest                  True Comp1
WDAGUtilityAccount     True Comp1
NOT_FOUND              TRUE Comp2
NOT_FOUND              TRUE Comp3   
Administrator         False Comp4
DefaultAccount         True Comp4
Guest                  True Comp4
WDAGUtilityAccount     True Comp4
0

1 Answer 1

1

The problem is that you don't clear $obj for each $Computer, so $Obj|Where-Object{$_.Name -like "$Account"} will produce duplicates.

Move $Obj = @() inside of the loop:

Foreach($Computer in $ComputerName)
{
    $Obj = @()

    ...
}

Alternatively move the last if/else code block out of the loop:

$Obj = @()

Foreach($Computer in $ComputerName)
{
    ...
}

If($AccountName)
{
    Foreach($Account in $AccountName)
    {
        $Obj|Where-Object{$_.Name -like "$Account"}
    }
}
else
{
    $Obj
}
Sign up to request clarification or add additional context in comments.

1 Comment

I actually thought about that, but was worried that it would empty the string array, but it actually does make sense....

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.