Here’s another useful PowerShell snippet which I created when I built my PowerShell Exchange Connector for SCSM. The function itself will return the user object of the given e-mail address. If no user is found you also have to option to create the user object using the -CreateUser switch.
The function have the following parameters:
-EmailAddress
The e-mail address of the user who you want to retrieve
-CreateUser
If this switch is enetered, the function will create a user object if no match is found in the CMDB
-Name
If you know the name of the user that you might create, you can specify the name of the object in this parameter
The script itself:
# This function will return the user object of the specified Email Address. If a matching user isn't found, the function can create an Internal user within the SCSM CMDB # NOTE: SMlets must be loaded in order for the function to work Function Get-UserByEmail { param ( [parameter(Mandatory=$True,Position=0)]$EmailAddress, [parameter(Mandatory=$False,Position=1)][switch]$CreateUser, [parameter(Mandatory=$False,Position=2)]$Name ) # Get all the classes and relationships $UserPreferenceClass = Get-SCSMClass System.UserPreference$ $UserPrefRel = Get-SCSMRelationshipClass System.UserHasPreference$ $ADUser = Get-SCSMClass Microsoft.Ad.User$ # Check if the user exist $SMTPObj = Get-SCSMObject -Class $UserPreferenceClass -Filter "DisplayName -like '*SMTP'" | ?{$_.TargetAddress -eq $EmailAddress} If ($SMTPObj) { # A matching user exist, return the object # If, for some reason, several users are found, return the first one If ($SMTPObj.Count -gt 1) {$SMTPObj = $SMTPObj[0]} $RelObj = Get-SCSMRelationshipObject -TargetRelationship $UserPrefRel -TargetObject $SMTPObj Return $AffectedUser = Get-scsmobject -Id ($RelObj.SourceObject).Get_Id() } elseif ($CreateUser -and !$SMTPObj) { # A matching user does NOT exist. Do some processing to get the needed properties for creating the user object If (!$Name -or $Name -eq '') { $Name = $EmailAddress.Substring(0,$EmailAddress.IndexOf("@")) $UserName = $Name.Replace(",","") $UserName = $UserName.Replace(" ","") } else { $Name = $Name $UserName = $Name.Replace(",","") $UserName = $UserName.Replace(" ","") } # Try Username to make sure we have a unique username $Loop = $TRUE $i = 1 While ($Loop -eq $TRUE) { $tempUser = Get-SCSMObject -Class (Get-SCSMClass System.Domain.User$) -Filter "UserName -eq $UserName" If ($tempUser) { $UserName = $UserName + $i $i = $i +1 } elseif ($i -gt 15) { Throw "Unable to find a unique username for the new user" } else { $Loop = $False } } # Create the Property Hash for the new user object $PropertyHash = @{"DisplayName" = $Name; "Domain" = "SMINTERNAL"; "UserName" = $UserName; } # Create the actual user object $AffectedUser = New-SCSMObject -Class (Get-SCSMClass System.Domain.User$) -PropertyHashtable $PropertyHash -PassThru # Add the SMTP notification address to the created user object If ($AffectedUser) { $NewGUID = ([guid]::NewGuid()).ToString() $DisplayName = $EmailAddress + "_SMTP" $Projection = @{__CLASS = "System.Domain.User"; __SEED = $AffectedUser; Notification = @{__CLASS = "System.Notification.Endpoint"; __OBJECT = @{Id = $NewGUID; DisplayName = $DisplayName; ChannelName = "SMTP"; TargetAddress = $EmailAddress; Description = $EmailAddress; } } } New-SCSMObjectProjection -Type "System.User.Preferences.Projection" -Projection $Projection } # Return the created user object Return $AffectedUser } }
Using the function to retrieve a user:
Using the -CreateUser switch:
You can also download the whole script as a file here: Get-UserByEmail