We help IT Professionals succeed at work.

Strange behaviour with Filter in Powershell

Kasper Katzmann
on
90 Views
Last Modified: 2017-03-24
I have a function, that seached our AD for security groups that contains a specified server name.
When I use different variants of the same server name, I get different results.

PS C:\Users\Me> GetServerGroups EFKM-WZ-IIS01T
RDP:
SG-EFKM-WZ-IIS01T_RDP_User

LOCAL ADMIN:
SG-EFKM-WZ-IIS01T_Local_Admin

PS C:\Users\Me> GetServerGroups WZ-IIS01T
RDP:
SG-EFKM-WZ-IIS01T_RDP_User

LOCAL ADMIN:
Der er ikke oprettet nogen ADMIN grupper, der matcher WZ-IIS01T

PS C:\Users\Me> GetServerGroups IIS01T
RDP:
Der er ikke oprettet nogen RDP grupper, der matcher IIS01T

LOCAL ADMIN:
SG-EFKM-WZ-IIS01T_Local_Admin

Open in new window


The function can be seen here. The filters are at line 49 and 75.
Function:
Function GetServerGroups()
{
<# 
  .EXAMPLE
  ServerGroups SIT-CTXAPP0013 -Type admin
  .EXAMPLE
  ServerGroups SIT-CTXAPP0013 rdp
  .EXAMPLE
  ServerGroups SIT-CTXAPP0013 all
  #> 

[CmdletBinding()] 
  Param(
  [Parameter(Mandatory=$True,Position=1)]
   [Array]$srv,
  [Parameter(Mandatory=$False,Position=2)]
   [String]$Type
	
    )

$srv = $srv -replace (" ","")

IF($Type -eq "all"){
    Write-Host -BackgroundColor Yellow -foreGroundColor Black "ALLE GRUPPER:"
    
    Foreach($sAll in $srv){
	    $all = Get-ADGroup -filter 'Name -like "*$sAll*"' #| Where {$_.Name -like "*$sAll*"}
        
        If($all.length -lt 3){
                Write-Host -foreGroundColor Red "Der er ikke oprettet nogen grupper, der matcher $sALL"
            }
        else{
            foreach($allGrp in $all){
                Write-Host $allGrp.name
            }
            }
    Write-Host " "
    }
	    
}
ELSE{
	
    #FINDS RDP USER SECURITY GROUPS THAT MATCHES THE SERVER NAME
	If(($Type -eq "") -or ($Type -eq "rdp")){
	Write-Host -BackgroundColor Yellow -foreGroundColor Black "RDP:"
	    Foreach($sRDP in $srv){

            $RDPName = "$sRDP"
	        $RDP = Get-ADGroup  -filter "Name -like '*$RDPName*'" `
                                -SearchBase "OU=Server RDP User,OU=Globale Security Groups,OU=Administration,DC=SUBDOMAIN,DC=DOMAIN,DC=DK" `
                                -SearchScope Subtree
	            
        #write-host $rdp
        If($RDP.length -lt 3){
                Write-Host -foreGroundColor Red "Der er ikke oprettet nogen RDP grupper, der matcher $sRDP"
            }
        else{
            foreach($rdpGrp in $RDP){
                Write-Host $rdpGrp.name
            }
            }
        
        
	    }
	
    	Write-Host " "
	}
    
    #FINDS LOCAL ADMIN SECURITY GROUPS THAT MATCHES THE SERVER NAME
	If(($Type -eq "") -or ($Type -eq "admin")){
	Write-Host -BackgroundColor Yellow -foreGroundColor Black "LOCAL ADMIN:"
	    Foreach($sLA in $srv){

            $LAName = "$sLA"
	        $LOCADM = Get-ADGroup   -filter "Name -like '*$LAName*'" `
                                    -SearchBase "OU=Server Local Admin,OU=Globale Security Groups,OU=Administration,DC=SUBDOMAIN,DC=DOMAIN,DC=DK" `
                                    -SearchScope Subtree
	            

        If($LOCADM.length -lt 3){
                Write-Host -foreGroundColor Red "Der er ikke oprettet nogen ADMIN grupper, der matcher $sLA"
            }
        else{
            foreach($LAGrp in $LOCADM){
                Write-Host $LAGrp.name
            }
            }

	
	    }
	
    	Write-Host " "
	}
}
}

Open in new window

Any ideas about why it acts so strange?
Comment
Watch Question

Jason CrawfordTransport Ninja
CERTIFIED EXPERT

Commented:
You have to enclose variables with double quotes
Kasper KatzmannSeniorkonsulent

Author

Commented:
Well, have tried that - with the same result.
CERTIFIED EXPERT
Top Expert 2014
Commented:
This problem has been solved!
(Unlock this solution with a 7-day Free Trial)
UNLOCK SOLUTION
Kasper KatzmannSeniorkonsulent

Author

Commented:
I, have tried your variant as well and, as you point out, it gives the same result.

If($LOCADM.length -lt 3) just checks if there are anything.

I'm running it from a management server (2012 R2).

-------------------------------

Could there be anything with the dashes in the servernames?
I simply can't figure out why the result vary, when it should be the same.

After all *EFKM-WZ-IIS01T*, *WZ-IIS01T* and *IIS01T* should give the same result.
Kasper KatzmannSeniorkonsulent

Author

Commented:
It was If($LOCADM.length -lt 3) that caused the strange behaviour. Changed it to If($LOCADM.count -eq 0) and now it works as supposed.

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions