none
在C#里通过graph api创建的user's manager,删除不掉 RRS feed

  • 问题

  • 不好意思,在global里提的问题,没人回答转到这来,希望有牛人帮忙解决一下

    问题地址https://social.msdn.microsoft.com/Forums/azure/en-US/99045cbc-9dbd-443c-95df-7289ddc3539c/azure-graph-api-c-client-unable-to-delete-users-manager-object?forum=WindowsAzureAD#be10ffa0-7c02-45db-a63f-d3cc7a6713ec

    功能语法参照这个library:http://blogs.msdn.com/b/aadgraphteam/archive/2014/12/12/announcing-azure-ad-graph-api-client-library-2-0.aspx 

    2016年4月22日 2:56

答案

全部回复

  • 你好 Lingli,

    根据我的调查,我觉得这个问题是关于扩展属性的一些限制,当你把DirectoryObject对象作为值赋予扩展属性的场景下。Directory schema extensions | Graph API concepts 这篇文章提到了这个限制,请到文章的末尾看下。
    An extension property value must be explicitly set to null in order to be removed from a directory object. If an extension property value is set on a directory object and that extension property becomes inaccessible in the directory for any of the reasons cited above, then the extension property will no longer be visible on that directory object. It will, however, still count against the 100 extension property value limit for that object. Until the availability of the extension property is restored -- for example, in some cases, by consenting to the application again -- the value will not be accessible for either read or write.
    解决办法非常简单,不要使用directory object作为扩展属性,直接使用初始化一个ExtensionProperty来赋值,这样就能绕开上述的限制。

    这个论坛主要是回答关于中国 Azure 开发方面的问题。如果可以的话请提供一个Code Sample,我帮你在中国Azure里面调试一下。

    希望能够帮到你。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年4月22日 8:29
  • 我在github里放了一个sample,你可以用它调试,

    非常感谢




    • 已编辑 Lingli_w 2016年4月25日 8:27
    2016年4月25日 8:24
  • 你好 Lingli,

    我Fork了一份你的代码,用下面的示例在China Azure里面测试了一下设置和取消Manager属性,能够正常地设置和取消Manager。

     try
                {
                    activeDirectoryClient = AuthenticationHelper.GetActiveDirectoryClientAsApplication();
                }
                catch (AuthenticationException ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Acquiring a token failed with the following error: {0}", ex.Message);
                    if (ex.InnerException != null)
                    {
                        //You should implement retry and back-off logic per the guidance given here:http://msdn.microsoft.com/en-us/library/dn168916.aspx
                        //InnerException Message will contain the HTTP error status codes mentioned in the link above
                        Console.WriteLine("Error detail: {0}", ex.InnerException.Message);
                    }
                    Console.ResetColor();
                    Console.ReadKey();
                    return;
                }


                //测试方法,先注释取消manager里面的代码,这样可以设置第一个member的 manager
                // 然后注释掉  设置manager里面的代码, 这样可以取消第一个member的manager
                
                #region 设置manager
                //第一个member
                var upn = "jayhamlin@herro.partner.onmschina.cn";
                var userLookupTask = activeDirectoryClient.Users.Where(
                    user => user.UserPrincipalName.Equals(
                        upn, StringComparison.CurrentCultureIgnoreCase)).ExecuteSingleAsync();
                User userJohnDoe = (User)await userLookupTask;
                //第二个member
                var upn1 = "zhangsan@herro.partner.onmschina.cn";
                var userLookupTask1 = activeDirectoryClient.Users.Where(
                    user => user.UserPrincipalName.Equals(
                        upn1, StringComparison.CurrentCultureIgnoreCase)).ExecuteSingleAsync();
                User userjoywait = (User)await userLookupTask1;
                //第二个member设为第一个member的manager
                userJohnDoe.Manager = (DirectoryObject)userjoywait;
                //保存
                userJohnDoe.UpdateAsync().Wait();
                #endregion
                
                #region 取消manager
                //第一个member
                var upn = "jayhamlin@herro.partner.onmschina.cn";
                var userLookupTask = activeDirectoryClient.Users.Where(
                    user => user.UserPrincipalName.Equals(
                        upn, StringComparison.CurrentCultureIgnoreCase)).ExecuteSingleAsync();
                User userJohnDoe = (User)await userLookupTask;
                //第二个member
                var upn1 = "zhangsan@herro.partner.onmschina.cn";
                var userLookupTask1 = activeDirectoryClient.Users.Where(
                    user => user.UserPrincipalName.Equals(
                        upn1, StringComparison.CurrentCultureIgnoreCase)).ExecuteSingleAsync();
                User userjoywait = (User)await userLookupTask1;
                //去掉第一个member的manager属性s
                userJohnDoe.Manager = null;
                //保存
                userJohnDoe.UpdateAsync().Wait();
                #endregion

    我pull了个request到你的代码库,请测试一下。

    希望能够帮到你。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2016年4月25日 15:21
  • 谢谢你的热心解答,我在问题写到了我用了user.Manager=null, 调试的时候查看是没问题,但是Azure上面没有清空,没有任何改变。改变manager对象,update是没问题的


    我new一个空的user对象付给它也没有改变,换个有value的user就可以
    • 已编辑 Lingli_w 2016年4月26日 3:01
    2016年4月26日 2:49
  • 你好,

    >> 我在问题写到了我用了user.Manager=null, 调试的时候查看是没问题,但是Azure上面没有清空,没有任何改变。改变manager对象,update是没问题的

    这个问题确实存在,设置为null后代码里面确实没有Manager了,但是在Portal里面还是存在的。 然后我在Azure Sample里面看到已经有人反馈了这个问题,现在还没有修复,请关注这个链接, https://github.com/Azure-Samples/active-directory-dotnet-graphapi-console/issues/31 页面上有个Workaround可以暂时解决这个问题,请看这里。http://stackoverflow.com/questions/35754241/how-to-remove-a-users-manager-in-azuread-using-microsoft-azure-activedirectory-g/36598494#36598494

    >>我new一个空的user对象付给它也没有改变,换个有value的user就可以

    空的User对象应该是无法保存进去的。

    希望能够帮到你。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Lingli_w 2016年4月26日 10:05
    2016年4月26日 5:41
  • 我试了他的方法,导致的结果就是直接把付给它的manager那个用户给删了,我试了只要作为manager的那个用户删除,manager就为空了。我删manager不小心把管理员账号给删了,问题来了,子管理员怎么把管理员账号加到AD里?

    2016年4月26日 8:54
  • 我用Powershell命令去运行

    var url = "https://graph.windows.net/<tenant domain>/users/<userid>/$links/manager?api-version=1.6"
    var resp = httpClient.DeleteAsync(url).Result;

    会把manager的这个用户删掉。

    在visual studio里运行没有这个问题。

    2016年4月26日 10:07