1

我已经定义了一个列表,作为字段之一(实际上是几个字段),有一个人或组选择器。我使用 SharePoint 列表源数据流源转储到 SQL 表中,通过 SSIS 包提取整个列表。PoG 选择器字段像这样转储其数据(每行是一个数据项):

163;#Jones, Danny S.
179;#Smith, Sandra M.
164;#Thomas, Rob Y.
161;#Ross, Danny L.
2064;#Smith, Michael D.

我猜想 ;# 前面的数字是 SharePoint 保留给用户的某种用户 ID,而不是像 ADS guid 这样有用的东西。我是否可以使用 SSIS 提取 SharePoint 的用户配置文件,以便将显示的 ID 与 ADS guid 或 ADS 用户名匹配,如果可以,如何匹配?我尝试使用 SSIS 中的 Web 服务任务来调用用户配置文件服务 (http://www.my.site/_vti_bin/UserProfileService.asmx),但我收到有关 WSDL 版本错误的错误。

4

3 回答 3

1

不幸的是,站点字段中显示的 ID 对于该站点的用户列表来说是本地的。

每个用户由站点和列表 guid 以及 ID 字段唯一标识,但 ID 在用户列表中不是唯一的,因此除了索引到该表之外不能用于任何其他用途。

此数据的另一个问题是配置文件显示由 UserProfileSynchronization 服务木材作业之一定期更新。我曾经历过用户的显示名称未正确更新并将设置为 Active Directory 中的帐户名称的情况。

要了解幕后发生的事情,请查看内容数据库中的 All_UserData 表。

总之

只有字段的名称部分才能以有意义的方式使用,即使这样也不完全可靠,但也许已经足够好了。

于 2011-03-01T21:30:33.007 回答
0

您可以修改从 SharePoint 导出的字段吗?您可以添加基于此字段的计算人员字段吗?如果是这样,那么您可以让 Person 字段存储不同形式的人员数据,例如他们的用户名或电子邮件地址,这在与其他系统交互时更有用。

于 2011-03-02T04:22:13.120 回答
0

纳特的答案很接近。它实际上是 UserInfo 表。这些数字对应于该表的 tp_ID 列。不幸的是,我仍然不知道如何使用 SSIS 提取此信息,因此我正在编写一个控制台应用程序,该应用程序通过 Sharepoint Web 服务提取表的数据并将其转储到数据库表中并使用 Windows 任务对其进行调度调度器。此外,由于 Sharepoint 的工作方式,每个根网站集对每个人都有不同的 ID,因此我需要为每个根网站集进行单独的拉取。这是我正在使用的方法:

    private static XElement GetUserInfo(string siteCollectionListsSvc)
    {
        SharepointListsSvc.ListsSoapClient ws = new SharepointListsSvc.ListsSoapClient();
        ws.Endpoint.Address = new System.ServiceModel.EndpointAddress(siteCollectionListsSvc);

        ws.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        ws.ClientCredentials.Windows.AllowNtlm = true;
        ws.ClientCredentials.Windows.ClientCredential = (System.Net.NetworkCredential)System.Net.CredentialCache.DefaultCredentials;

        XElement userInfo = ws.GetListItems("UserInfo", String.Empty, null, null, "4000", null, null);

        return userInfo;
    }

方法参数类似于“http://www.my.site/_vti_bin/lists.asmx”。我设置绑定和端点的应用程序配置:

<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="5000000" maxBufferPoolSize="524288" maxReceivedMessageSize="5000000"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://www.my.site/_vti_bin/lists.asmx"
            binding="basicHttpBinding" bindingConfiguration="ListsSoap"
            contract="SharepointListsSvc.ListsSoap" name="ListsSoap" />
    </client>
</system.serviceModel>
</configuration>

请注意,我将 //binding/@maxBufferSize 和 //binding/@maxReceivedMessageSize 从默认的 65536 增加到 5000000。我们有大约 3000 条可以返回的记录,而默认大小还不够大。由于这些都是内部调用,我不担心网络延迟。默认绑定的其他更改在 //security 元素中,特别是 @mode 和 //transport/@clientCredentialType 属性。

当你取回 XML 时,数字(存储在 PoG 字段中)在 //z:row/@ows_ID 属性中,而他对应的 ADS 登录在 //z:row/@ows_Name 属性中。您还可以在 //z:row/@ows_EMail 属性中获取电子邮件地址。

希望这可以帮助其他人解决同样的问题!

于 2011-03-02T14:55:56.607 回答