【问题标题】:GetUserProfileByName properties inconsistentGetUserProfileByName 属性不一致
【发布时间】:2012-10-17 11:50:14
【问题描述】:

我只是尝试使用 GetUserProfileByName 服务从 AD 中获取有关用户的一些详细信息。为此,我选择使用 javascript。经过一些研究和大量修改后,我设法连接到 Web 服务并成功检索数据。

我使用了一个简单的 if 语句来比较属性的“名称”,以获得我想要的具体值。

if(xmlDoc.getElementsByTagName("Name")[i].childNodes[0].nodeValue == "Department")
{
    property = xmlDoc.getElementsByTagName("Value")[i].childNodes[0].nodeValue;
}

此时我开始注意到一些差异。我似乎没有得到我在比较中指定的属性。例如,如果我指定“部门”,它会返回电子邮件。经过一番挣扎后,我最终决定将所有“名称”和“值”字段放入两个数组中而不进行任何比较,并将它们彼此相邻显示。

for(i = 0; i < 13 ; i++)
{
    description[i] = xmlDoc.getElementsByTagName("Name")[i].childNodes[0].nodeValue;
    elements[i] = xmlDoc.getElementsByTagName("Value")[i].childNodes[0].nodeValue;
}

由此得出的结论是,这两个字段显然不匹配:

UserProfile_GUID: 65f017dc-b892-4afa-8730-5e8f73aa7b86
帐户名: CAPETOWN\ANEL5
名字: AbrahamSPS-PhoneticFirstName: Nel
姓: Abraham Nel
SPS-PhoneticLastName: 021 ### ####
首选名称: CRS - Info Sys & Tech
SPS-PhoneticDisplayName: 承包商
WorkPhone: 承包商
部门: ANEL5
职称: CN=Abraham Nel,OU=Standard,OU=Users,OU=End-User Services,DC=###,DC=# ##,DC=###
SPS-JobTitle: ###@###.###
经理: 开普敦市民中心讲台阻止

知道为什么会这样吗?

尝试将整个 XML 文档解析为字符串的结果:

falsefalseUserProfile_GUIDNotSetb21ec99c-2ad9-40a8-9d45-a3273c92ee5afalsefalseAccountNameNotSetCAPETOWN \ AHEYNESfalsefalseFirstNameNotSetAshleyfalsefalseSPS-PhoneticFirstNameNotSetfalsefalseLastNameNotSetHeynesfalsefalseSPS-PhoneticLastNameNotSetfalsefalsePreferredNameNotSetAshley HeynesfalsefalseSPS-PhoneticDisplayNameNotSetfalsefalseWorkPhoneNotSet021 400个#### falsefalseDepartmentNotSetCRS - 信息Sys系统&TechfalsefalseTitleNotSetAssistant专业OfficerfalsefalseSPS-JobTitleNotSetAssistant专业OfficerfalsefalseManagerNotSetCAPETOWN \ DSISSINGfalsefalseAboutMeNotSetfalsefalsePersonalSpaceNotSetfalsefalsePictureURLNotSetfalsefalseUserNameNotSetAHEYNESfalsefalseQuickLinksNotSetfalsefalseWebSiteNotSetfalsefalsePublicSiteRedirectNotSetfalsefalseSPS-虚线-lineNotSetfalsefalseSPS-PeersNotSetfalsefalseSPS-ResponsibilityNotSetfalsefalseSPS-SipAddressNotSetfalsefalseSPS -MySiteUpgradeNotSetfalsefalseSPS-ProxyAddressesNotSetfalsefalseSPS-HireDateNotSetfalsefalseSPS-DisplayOrderNotSe tfalsefalseSPS-ClaimIDNotSetfalsefalseSPS-ClaimProviderIDNotSetfalsefalseSPS-ClaimProviderTypeNotSetfalsefalseSPS-SavedAccountNameNotSetfalsefalseSPS-ResourceAccountNameNotSetfalsefalseSPS-ObjectExistsNotSetfalseSPS-MasterAccountNameNotSetfalsefalseSPS-DistinguishedNameNotSetCN=Ashley Heynes,OU=Developers,OU=Users,OU=End-User Services,DC=##,DC falsefalseSPS-SourceObjectDNNotSetfalsefalseWorkEmailNotSet##.##@##.##.##falsefalseCellPhoneNotSetfalsefalseFaxNotSetfalsefalseOfficeNotSetCape镇保罗绍尔BuildingfalsefalseSPS-LocationNotSetfalsefalseSPS-TimeZoneNotSetfalsefalseAssistantNotSetfalsefalseSPS-PastProjectsNotSetfalsefalseSPS-SkillsNotSetfalsefalseSPS-SchoolNotSetfalsefalseSPS-BirthdayNotSetfalsefalseSPS-StatusNotesNotSetfalsefalseSPS-InterestsNotSetfalsefalseSPS-EmailOptinNotSet

【问题讨论】:

  • 返回的 XML 文档是什么样的?名称和值是否在 XML 本身中正确排列?一种可能性是 getElementsByTagName() 函数没有按照标签在文档中出现的顺序返回标签。另一种可能性可能是存在比 Name 元素更多或更少的 Value 元素,因此当仅通过索引查找时它们会不同步。我们需要查看 XML 来确定。
  • @John :我很抱歉,但我对 SharePoint 和使用 Web 服务等还很陌生。我所做的是使用 JavaScript 在页面上调用 Web 服务,并将其写入 SharePoint 网站上的空白网页。这是否会创建一个 XML 并将其存储在站点的某个位置?我可以指定 Web 服务来返回 XML 文档吗?当我处理这个问题时,我怀疑有更多的 Name 元素而不是 Value 元素,但认为它们会被专门用 Name 元素索引到 Value 元素。在这方面我显然错了。
  • @John :我再次检查了我的代码,发现我确实从 Web 服务返回了一个 XML 变量。我做了一些 Google-ing 尝试使用 var string = xmlNode.xml; 将整个 xml 写入屏幕这似乎返回了很多 Value 元素,而没有任何 XML 格式的元素。无论如何,我将其附加到上述问题中。

标签: javascript active-directory user-profile


【解决方案1】:

四处搜索,似乎 XML 结构不适合您使用的逻辑。 XML 如下所示:

PropertyData*
    Name
    Values
        ValueData
            Value

我不确定每个元素的基数,但我认为迭代 xmlDoc.getElementsByTagName('PropertyData') 然后在该块中找到 Name 和(可能多个)Value 元素会更安全。

var properties = xmlDoc.getElementsByTagName("PropertyData");

for (var i = 0, item; item = properties[i]; ++i) {
    // search for Name and Value inside here
}

更新

这很可能是由 FirstName 的多个值引起的:AbrahamNelAbraham Nel

【讨论】:

  • 上述方法看起来很有趣。 getElementsByTagName("PropertyData"); 似乎返回了一个 xml 变量数组。我目前正在尝试弄清楚如何在每个 xml 元素中找到值:&lt;PropertyData xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"&gt;&lt;IsPrivacyChanged&gt;false&lt;/IsPrivacyChanged&gt;&lt;IsValueChanged&gt;false&lt;/IsValueChanged&gt;&lt;Name&gt;FirstName&lt;/Name&gt;&lt;Privacy&gt;Public&lt;/Privacy&gt;&lt;Values&gt;&lt;ValueData&gt;&lt;Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string"&gt;Abraham&lt;/Value&gt;&lt;/ValueData&gt;&lt;/Values&gt;&lt;/PropertyData&gt;
  • @Carel 在我创建的循环中,每个item 都是另一个可以执行搜索的 XML 节点。
  • 好的,所以我使用 item.getElementsByTagName("Name")[0].childNodes[0].nodeValue 等进行搜索,但是一旦我尝试搜索与以 SPS 开头的名称关联的 例如:SPS-PhoneticFirstName 循环失败。如果我使用硬编码的 if 语句手动搜索这些值周围的值:if(i == 8),我实际上得到了准确的结果。在没有调试工具的情况下,在 IE 中很难做到这一点。
  • 啊。我升级了我的 IE 并使用了 F12 开发人员工具,并确定我需要这样的东西:if(item.getElementsByTagName("Value")[0] != null),因为某些字段的值为空。
  • @Carel 这听起来很合理; Value 并不总是必须存在,在这种情况下,item 只有名称而没有值。
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 2014-05-15
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2020-05-14
相关资源
最近更新 更多