Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CRM Dynamics 2011中删除用户_C#_Dynamics Crm 2011_Dynamics Crm_Integration Testing_Microsoft Dynamics - Fatal编程技术网

C# 在CRM Dynamics 2011中删除用户

C# 在CRM Dynamics 2011中删除用户,c#,dynamics-crm-2011,dynamics-crm,integration-testing,microsoft-dynamics,C#,Dynamics Crm 2011,Dynamics Crm,Integration Testing,Microsoft Dynamics,我完全知道,Microsoft不支持在CRM Dynamics 2011中删除用户(SystemUser实体) 然而,我们目前正在开发一种工具来支持我们的用户资源调配需求。为了能够为此工具编写集成测试,似乎有必要在之后删除用户,以便我们可以将测试环境回滚到原始状态。 目前,我们正在通过从SQL备份中恢复组织来实现这一点,但这对于每次测试运行来说太耗时了 更新 到目前为止,我们最好的解决方案是在集成测试中创建一个用户,断言我们需要断言的所有内容,然后通过禁用该用户并删除其AD凭据来“清理”,以便我

我完全知道,Microsoft不支持在CRM Dynamics 2011中删除用户(SystemUser实体)

然而,我们目前正在开发一种工具来支持我们的用户资源调配需求。为了能够为此工具编写集成测试,似乎有必要在之后删除用户,以便我们可以将测试环境回滚到原始状态。
目前,我们正在通过从SQL备份中恢复组织来实现这一点,但这对于每次测试运行来说太耗时了

更新 到目前为止,我们最好的解决方案是在集成测试中创建一个用户,断言我们需要断言的所有内容,然后通过禁用该用户并删除其AD凭据来“清理”,以便我们可以在下一次运行测试时重新使用这些凭据

然而,由于我们只是在寻找一个测试环境的解决方案,我真的希望有一个能够正确清理一切的解决方案:删除SQL中的记录似乎是一种可行的方法。但是,由于数据库结构复杂,我希望有人能为此提供脚本

更新2
我们已经创建了从SQL手动删除用户的脚本(请参阅接受的答案)。这是不受支持的,所以只有在测试环境中使用它,如果你知道你在做什么的话。

这是不受支持的,但是直接从SQL中删除记录怎么样


我自己从来没有尝试过,我也不想在生产环境中使用它,但如果只是为了测试/开发,最糟糕的情况是你把开发环境弄糟了。

也许你可以尝试一下这种方法。不只是禁用它们,而是将active directory名称更改为其他名称,然后禁用记录

例如,您的脚本可能如下所示(假设使用AD身份验证):

创建广告用户msmithbmillerjdoe

执行测试和验证

将msmith更新为testuser1 更新bmiller测试用户2
将jdoe更新为testuser3

停用testuser1testuser2testuser3

下一个测试将需要使用testuser4testuser5testuser6,这意味着您需要创建许多虚拟帐户,但这样做可能比搞乱CRM SQL数据库更容易


对于我需要用户的单元测试,我实际上模拟了仅针对SystemUser请求的IOOrganizationService调用,并返回一个模拟的SystemUser实体,而不实际访问CRM。我也建议您这样做,但听起来您似乎在尝试实际测试系统用户创建,因此在这种情况下,可能不是一个选项。

您可以使用完全不受支持的方式通过SQL删除它们。
只要您在集成测试环境中这样做,我认为危害相对较小

要查找添加用户时在数据库中所做的更改,可以

  • 复制当前数据库
  • 添加用户
  • 将新数据库状态与前一个数据库状态进行比较(例如:redgate的SQL比较)

每次汇总都可能会更改此脚本,因此请确保任何关键代码或生产代码都不依赖此脚本。

Microsoft不支持以下脚本。使用它可能会对您的CRM组织、部署、服务器和职业生涯造成伤害、伤害、破坏或骚扰。
千万不要使用这个。
永远。

这就是说,我们使用了它,它很好地实现了我们的目的:在运行
AddSystemUser
测试后清理测试环境

要记住的其他一些事情:

  • 我们在本地使用CRM Dynamics 2011 UR10
  • 我们的测试用户没有任何相关记录,它只是一个孤立的用户
  • 我们正在使用广告认证

以下是我在基于Joris代码的CRM 2015中所做的工作

USED ORGANIZATIONNAME_MSCRM

BEGIN TRANSACTION

DECLARE @username AS VARCHAR(50)



-- CHANGE THIS --

SET @username = 'AD\USERNAME'

-- DONT CHANGE ANYTHING AFTER THIS --



DECLARE @userId AS UNIQUEIDENTIFIER

SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)



DECLARE @orgid AS UNIQUEIDENTIFIER

SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)



DECLARE @userEmail AS VARCHAR(MAX)

SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @userfullname AS VARCHAR(max)

SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)



DECLARE @queueid AS UNIQUEIDENTIFIER

SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @ownerid AS UNIQUEIDENTIFIER

SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)



DECLARE @MSCRMUserID as UNIQUEIDENTIFIER

SET @MSCRMUserID = (SELECT Userid FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid)

DECLARE @authinfo as NVARCHAR(255)

SET @authinfo = (SELECT Authinfo FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)

DECLARE @SUid as UNIQUEIDENTIFIER

SET @Suid = (SELECT id FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)



DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserPrincipals WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserRoles WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid

DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid

DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId



DELETE FROM dbo.QueueMembership  WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid

DELETE FROM dbo.QueueBase WHERE QueueId = @queueid



DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid

DELETE FROM dbo.PrincipalObjectAccess WHERE PrincipalId = @ownerid

DELETE FROM dbo.MailboxBase WHERE OwnerId = @ownerid

DELETE FROM dbo.OwnerBase WHERE OwnerId = @ownerid

DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail

DELETE FROM dbo.ResourceBase WHERE name = @userfullname

DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)

DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId

DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId



DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid

DELETE FROM mscrm_config..SystemUserAuthentication WHERE authinfo = @authinfo

DELETE FROM mscrm_config..SystemUser WHERE id = @MSCRMUserID



rollback

--COMMIT
运行查询并确保它删除了正确的数据后,可以取消对COMMIT语句的注释,并对Rollback语句进行注释


希望能有所帮助。

仅对Dynamics CRM 2016(内部部署)进行一些轻微修改,以允许我遇到一些常见的约束错误。同样,这是完全不受支持的,并由您自行承担风险。(当我发现其他约束错误时,我将进行更新。)


为什么不禁用用户?@GuidoPreite,因为我们正在测试围绕插入新用户而构建的软件。如果我们禁用它们,我们仍然无法重用用户帐户来再次插入它。事实上,我已经认为这可能是最简单的方法。但是:我希望有人以前做过这件事,并且可以提供SQL脚本来做这件事,因为这将是一个复杂的过程。非常感谢您的回复。你的工作听起来确实可行。然而,这将要求我们保留一个计数器,记录我们已经创建了多少用户,并且这将使我们的CRM集成测试环境与旧的测试用户混杂在一起。因此,我认为这绝对是一个选项,但并不理想。在模拟用户时:这种方法确实不是这个特定请求的选项,因为我们想测试系统用户的创建。@JorisVanRegemortel-您不需要计算已经创建了多少用户,您只需执行一个查询,并搜索最大的testuser(为了排序,可能希望将其命名为testuser00001)。但同样,这可能是一种治疗比疾病更糟糕的情况(即,找出清除用户帐户所需的SQL比创建所有这些用户帐户更容易),同意查询最大用户数,这将是最简单的方法。然而,这仍然会留下混乱的集成测试环境。SQL删除听起来还是个不错的选择
USED ORGANIZATIONNAME_MSCRM

BEGIN TRANSACTION

DECLARE @username AS VARCHAR(50)



-- CHANGE THIS --

SET @username = 'AD\USERNAME'

-- DONT CHANGE ANYTHING AFTER THIS --



DECLARE @userId AS UNIQUEIDENTIFIER

SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)



DECLARE @orgid AS UNIQUEIDENTIFIER

SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)



DECLARE @userEmail AS VARCHAR(MAX)

SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @userfullname AS VARCHAR(max)

SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)



DECLARE @queueid AS UNIQUEIDENTIFIER

SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @ownerid AS UNIQUEIDENTIFIER

SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)



DECLARE @MSCRMUserID as UNIQUEIDENTIFIER

SET @MSCRMUserID = (SELECT Userid FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid)

DECLARE @authinfo as NVARCHAR(255)

SET @authinfo = (SELECT Authinfo FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)

DECLARE @SUid as UNIQUEIDENTIFIER

SET @Suid = (SELECT id FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)



DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserPrincipals WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserRoles WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid

DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid

DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId



DELETE FROM dbo.QueueMembership  WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid

DELETE FROM dbo.QueueBase WHERE QueueId = @queueid



DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid

DELETE FROM dbo.PrincipalObjectAccess WHERE PrincipalId = @ownerid

DELETE FROM dbo.MailboxBase WHERE OwnerId = @ownerid

DELETE FROM dbo.OwnerBase WHERE OwnerId = @ownerid

DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail

DELETE FROM dbo.ResourceBase WHERE name = @userfullname

DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)

DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId

DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId



DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid

DELETE FROM mscrm_config..SystemUserAuthentication WHERE authinfo = @authinfo

DELETE FROM mscrm_config..SystemUser WHERE id = @MSCRMUserID



rollback

--COMMIT
BEGIN TRANSACTION
DECLARE @username AS VARCHAR(50)
/* CHANGE THIS LINE ONLY */
SET @username = 'DOMAIN\USERNAME'
/* END CHANGES */
DECLARE @userId AS UNIQUEIDENTIFIER
SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)
DECLARE @orgid AS UNIQUEIDENTIFIER
SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)
DECLARE @userEmail AS VARCHAR(MAX)
SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)
DECLARE @userfullname AS VARCHAR(max)
SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)
DECLARE @queueid AS UNIQUEIDENTIFIER
SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)
DECLARE @ownerid AS UNIQUEIDENTIFIER
SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)
DECLARE @MSCRMUserID as UNIQUEIDENTIFIER
SET @MSCRMUserID = (SELECT Userid FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid)
DECLARE @authinfo as NVARCHAR(255)
SET @authinfo = (SELECT Authinfo FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)
DECLARE @SUid as UNIQUEIDENTIFIER
SET @Suid = (SELECT id FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)
DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId
DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId
DELETE FROM dbo.SystemUserPrincipals WHERE SystemUserId = @userId
DELETE FROM dbo.SystemUserRoles WHERE SystemUserId = @userId
DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid
DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid
DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId
DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId
DELETE FROM dbo.QueueMembership  WHERE SystemUserId = @userId
update dbo.SdkMessageFilterBase set ModifiedOnBehalfBy = NULL where ModifiedOnBehalfBy = @userid
update dbo.SdkMessageFilterBase set CreatedOnBehalfBy = NULL where CreatedOnBehalfBy = @userid
DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid
DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)
DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId
DELETE FROM dbo.QueueBase WHERE QueueId = @queueid
DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid
DELETE FROM dbo.PrincipalObjectAccess WHERE PrincipalId = @ownerid
DELETE FROM dbo.UserEntityUISettingsBase WHERE OwnerID = @userid
DELETE FROM dbo.UserApplicationMetadataBase WHERE OwnerID = @userid
DELETE FROM dbo.PostFollowBase WHERE OwnerID = @userid
DELETE FROM dbo.MailboxBase WHERE OwnerId = @ownerid
DELETE FROM dbo.OwnerBase WHERE OwnerId = @ownerid
DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail
DELETE FROM dbo.ResourceBase WHERE name = @userfullname
DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId
DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid
DELETE FROM mscrm_config..SystemUserAuthentication WHERE authinfo = @authinfo
DELETE FROM mscrm_config..SystemUser WHERE id = @MSCRMUserID
/* rollback */
COMMIT