Recently I’ve had to add a user to Dynamics CRM 2016. This post is about how I did that with a module from the PowerShell Gallery.
First thing I needed to do was to find something that was available for use against Dynamics CRM 2016. So I searched PowerShell gallery and found this module: Microsoft.Xrm.Data.Powershell. In addition to this module I found some handy samples to work with this module found here: Microsoft.Xrm.Data.PowerShell.Samples
I was able to take these samples and come up with a usable script to add users to a group in this application. My purpose was to do the un-thinkable add users to a Admin group. While probably not the best thing to do, in my situation it was what I needed to do. So here is how I began.
I looked at this sample: UpdateCrmUserSettings.ps1
This helped me immensely in figuring out how I about connecting to my crm instance:
$adminUserCredentials = get-credential $organizationName = 'MyOrg' $serverUrl = 'http://mycrmserver.mycompany.com:80' $loadedandCorrectVersion = (get-command -module 'Microsoft.Xrm.Data.Powershell' -ErrorAction Ignore).version -eq '2.5' if(-not $loadedandCorrectVersion) { find-module -Name Microsoft.Xrm.Data.Powershell -MinimumVersion 2.5 -MaximumVersion 2.5 | Install-Module -Scope CurrentUser -AllowClobber -Force Import-Module -Name Microsoft.Xrm.Data.Powershell -MinimumVersion 2.5 -MaximumVersion 2.5 -Force -RequiredVersion 2.5 } $xcrmConn = Get-CrmConnection -OrganizationName $OrganizationName -ServerUrl $ServerUrl -Credential $AdminUserCredentials
I added some “plumbing” to try and force PowerShell to ensure that I only have version 2.5 of the module downloaded and imported into the session where I’m going to run this. The $xcrmConn will be the connection that we use to call every subsequent function in this update of our user. According to the documentation you can specify this Connection as a global variable, I chose to not do this so that I could understand what is going on from each call I make to this module.
The next task was to try and figure out how to get all the users. There are a bunch of different cmdlets that are there — From Get-CrmCurrentUserId to Get-MyCrmUserId as you can see below:
ps:\crm> get-command get*crm*user* CommandType Name Version Source ----------- ---- ------- ------ Alias Get-CrmCurrentUserId 2.5 Microsoft.Xrm.Data.Powershell Function Get-CrmUserMailbox 2.5 Microsoft.Xrm.Data.Powershell Function Get-CrmUserPrivileges 2.5 Microsoft.Xrm.Data.Powershell Function Get-CrmUserSecurityRoles 2.5 Microsoft.Xrm.Data.Powershell Function Get-CrmUserSettings 2.5 Microsoft.Xrm.Data.Powershell Function Get-MyCrmUserId 2.5 Microsoft.Xrm.Data.Powershell
None of them really seemed to deal or make sense out of how do I get all users or a specific user.. That is when I turned again back to the samples and found this Command
Get-CrmRecords
What I discovered is that you have to understand how to use the filters. The first thing I tried was to get all the users in CRM.
$users = Get-CrmRecords -EntityLogicalName systemuser -conn $xcrmconn -Fields systemuserid,fullname
After several runs(trial and error) I was able to get to a workable call to the get-crmRecords. For an individual User.
In order to add a user as an admin we’ll need to get the user’s id. Not only that we’ll also need to get the id of the Security Role that we are going to add them to.
$sysAdminrole = 'System Administrator' #user we are going to filter on must be in the syntax of last, first $userObject = Get-CrmRecords -conn $xcrmconn -EntityLogicalName systemuser -FilterOperator eq -FilterAttribute domainname -FilterValue "$domainUsername" -Fields domainname,fullname $userGuid = (($userObject | Where-Object {$_.keys -eq "crmRecords"}).values).systemuserid.guid $userName = (($userObject | Where-Object {$_.keys -eq "crmRecords"}).values).fullname if($userGuid) {$userRoles = (Get-CrmUserSecurityRoles -conn $xcrmconn -UserId $userGuid).roleid.guid} else { Throw "$DomainUsername not found in $ServerUrl and Organization $OrganizationName" } $adminObject = Get-CrmRecords -conn $xcrmconn -EntityLogicalName systemuser -FilterOperator eq -FilterAttribute domainname -FilterValue "$($AdminUserCredentials.username)" -Fields domainname,fullname #get the admins guid and user name $adminId = (($adminObject | Where-Object {$_.keys -eq "crmRecords"}).values).systemuserid.guid $AdminUserName = (($adminObject | Where-Object {$_.keys -eq "crmRecords"}).values).fullname $adminRoleObject = Get-CrmUserSecurityRoles -conn $xcrmConn -UserId $adminId | Where-Object {$_.rolename -eq $sysAdminrole} $adminroles = ($adminRoleObject).roleid.guid $adminRoleName = $adminroleobject.rolename
Now that I have the required items for adding the role. All i need to do is make sure that the role isn’t already there. Then add the Security Role ID to the user. Now you have a user that has the System Admin role added to it.
Full Script Follows:
#requires -module PowerShellGet
<# .SYNOPSIS A brief description of the updateusers.ps1 file. .DESCRIPTION A detailed description of the updateusers.ps1 file. .PARAMETER ServerUrl A description of the ServerUrl parameter. .PARAMETER OrganizationName Organization name in CRM For Example: yourorg .PARAMETER UserName2Add User name to add as an Admin To Crm For example Schumacher, Thomas .PARAMETER AdminUserCredentials Credentials that has admin privledges to the url passed. .EXAMPLE PS C:\> .\updateusers.ps1 -UserName2Add ‘Value1’ -xcrmCred (Get-Credential)
.NOTES
Additional information about the file.
#>
param
(
[string]$ServerUrl = ‘http://yourCrminstance.yourname.com:80’,
[string]$OrganizationName = ‘YourInstance’,
[Parameter(Mandatory = $true)]
[string]$DomainUsername =’domain\domainuser’,
[pscredential]$AdminUserCredentials = (Get-Credential)
)
$loadedandCorrectVersion = (get-command -module ‘Microsoft.Xrm.Data.Powershell’ -ErrorAction Ignore).version -eq ‘2.5’
if(-not $loadedandCorrectVersion)
{
find-module -Name Microsoft.Xrm.Data.Powershell -MinimumVersion 2.5 -MaximumVersion 2.5 | Install-Module -Scope CurrentUser -AllowClobber -Force
Import-Module -Name Microsoft.Xrm.Data.Powershell -MinimumVersion 2.5 -MaximumVersion 2.5 -Force -RequiredVersion 2.5
}
if(get-command -module ‘Microsoft.Xrm.Data.Powershell’)
{
$xcrmConn = Get-CrmConnection -OrganizationName $OrganizationName -ServerUrl $ServerUrl -Credential $AdminUserCredentials -Verbose
#https://github.com/seanmcne/Microsoft.Xrm.Data.PowerShell.Samples/blob/master/Microsoft.Xrm.Data.PowerShell.Samples/UpdateCrmUsersSettings/UpdateCrmUsersSettings.ps1
#get the necessary object for the admin
$sysAdminrole = ‘System Administrator’
#user we are going to filter on must be in the syntax of last, first
$userObject = Get-CrmRecords -conn $xcrmconn -EntityLogicalName systemuser -FilterOperator eq -FilterAttribute domainname -FilterValue "$domainUsername" -Fields domainname,fullname
$userGuid = (($userObject | Where-Object {$_.keys -eq "crmRecords"}).values).systemuserid.guid
$userName = (($userObject | Where-Object {$_.keys -eq "crmRecords"}).values).fullname
if($userGuid)
{$userRoles = (Get-CrmUserSecurityRoles -conn $xcrmconn -UserId $userGuid).roleid.guid}
else
{
Throw "$DomainUsername not found in $ServerUrl and Organization $OrganizationName"
}
$adminObject = Get-CrmRecords -conn $xcrmconn -EntityLogicalName systemuser -FilterOperator eq -FilterAttribute domainname -FilterValue "$($AdminUserCredentials.username)" -Fields domainname,fullname
#get the admins guid and user name
$adminId = (($adminObject | Where-Object {$_.keys -eq "crmRecords"}).values).systemuserid.guid
$AdminUserName = (($adminObject | Where-Object {$_.keys -eq "crmRecords"}).values).fullname
$adminRoleObject = Get-CrmUserSecurityRoles -conn $xcrmConn -UserId $adminId | Where-Object {$_.rolename -eq $sysAdminrole}
$adminroles = ($adminRoleObject).roleid.guid
$adminRoleName = $adminroleobject.rolename
if($adminRoleName -eq $sysAdminrole)
{
if($userroles -like $adminroles)
{
Write-Output "$DomainUsername is already an admin"
}
else
{
Add-CrmSecurityRoleToUser -conn $xcrmconn -UserId $userGuid -SecurityRoleId $adminId
Write-Output "$DomainUsername Added to AdminRole $adminRoleName"
}
}
else
{
Write-Warning "The $($AdminUserCredentials.username) doesn’t have the Role of ‘System Administrator’"
}
}
else
{ throw "cannot load the powershell module ‘Microsoft.Xrm.Data.Powershell’"}
I hope this helps someone
Until then keep Scripting
Thom