Author Posts

August 16, 2016 at 3:32 pm

Hello everyone,

I haven't worked with PS in over a year and even then I wasn't that experienced with it. I'm trying to see a simple script to remove all ProxyAddresses for a deprecated domain from my Active Directory accounts. However, the output is coming back with spaces after SMTP: and after the mailnickname field. Can someone tell me how to get rid of these spaces so the command works? Here is the script:

$ADobjects = @(Get-ADObject -Filter 'objectClass -eq "User"' -Properties mailNickname, ProxyAddresses) | Where-Object {$_.ProxyAddresses -Match "@domain.xyz"}
ForEach ($userObject in $ADobjects)
{
ForEach ($proxyAddress in $userObject.ProxyAddresses)

Set-ADUser $userobject.mailnickname -Remove '@{ProxyAddresses="SMTP:'$userObject.mailnickname'@domain.xyz}'

}

August 16, 2016 at 5:01 pm

Why are you performing set foreach proxy address?

We don't have to specify the .mailnickname property after set-aduser, the cmdlet is capable of binding the object to set-aduser. We wouldn't use this property for identity anyway.

I suspect you have issues in your qoutes. Singles are literal and I don't see the end double qoute. Use write-host to troubleshoot.

Get the value of what proxy you are looking for and remove it. No sense building a string of data that is already present.

Lastly improve your filter. get-aduser -Filter 'anr -like "smtp:*@mydomain.com"'

August 16, 2016 at 5:14 pm

Always work with one object first until you know for sure what it's doing.


$users = get-aduser -Filter 'anr -eq "smtp:myemail@somewhere.com"' -properties proxyaddresses

$users | %{

$proxytoremove = $_.proxyaddresses -match "@somedomain.somewhere.com"

Set-ADUser $_ -Remove @{ProxyAddresses=$proxytoremove} -whatif

}

August 16, 2016 at 6:42 pm

And don't ever, ever, ever use % as an alias for foreach-object in a production script

August 16, 2016 at 6:56 pm

Is there a technical reason for that or just opinion?

This would fit into the one off typed into shell never saved category:D

August 16, 2016 at 7:32 pm

Dan,

It best practice to use the cmdlet instead of alias. I can use ? in a statement like | ? {$_.something -like something} or I can do the same thing using the cmdlet like so: | where {$_.something -like something}. It's harder to read when using the alias instead of the cmdlet.

Thanks,
Freddy

August 16, 2016 at 7:52 pm

That's fine but still no documentation that says never ever ever. Just like the write-host opinions.

I do understand what they are for:D

  • This reply was modified 2 years ago by  Dan Potter.