2011-03-01 1 views
1

J'ai une liste définie comme l'un des champs (en fait quelques-uns des champs), avec un sélecteur Personne ou Groupe. J'extrait la liste entière à travers un package SSIS en utilisant la source de flux de données SharePoint List Source déversant dans une table SQL. Le champ sélecteur PoG dépotoirs ses données comme si (chaque ligne étant un seul élément de données):Extraction d'informations utiles d'une personne ou d'un groupe MOSS 2007 Envoyé par le biais du package SSIS

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

Je suppose que le nombre précédant le; # est une sorte d'ID utilisateur SharePoint conserve avec l'utilisateur au lieu de quelque chose d'utile comme un guide ADS. Puis-je utiliser SSIS pour extraire les profils d'utilisateur de SharePoint afin que je puisse faire correspondre l'ID indiqué à un guide ADS ou un nom d'utilisateur ADS, et si oui, comment? J'ai essayé d'utiliser la tâche de service Web dans SSIS pour appeler le service de profil utilisateur (http://www.my.site/_vti_bin/UserProfileService.asmx), mais j'obtiens une erreur sur le WSDL étant une mauvaise version.

Répondre

0

La réponse de Nat est proche. C'est en fait la table UserInfo. Les nombres correspondent à la colonne tp_ID de cette table. Malheureusement, je n'arrive toujours pas à comprendre comment extraire ces informations à l'aide de SSIS. J'utilise donc une application de console qui extrait les données de la table via le service Web Sharepoint et les dépose dans une table de base de données. Planificateur. De plus, en raison du fonctionnement de Sharepoint, chaque collection de sites racine a des ID différents pour chaque personne. Je dois donc effectuer des extractions distinctes pour chaque collection de sites racine. Voici la méthode que je utilise:

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; 
    } 

L'argument de la méthode serait quelque chose comme « http://www.my.site/_vti_bin/lists.asmx ». Ma config application qui met en place la liaison et le point final:

<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> 

Notez que j'augmenté la // liant/@ // MaxBufferSize et la liaison/@ maxReceivedMessageSize de la valeur par défaut de 65536 à 5000000. Nous avons environ 3000 enregistrements qui pourraient être retournés, et la taille par défaut n'était pas assez grande. Comme ce sont tous des appels internes, je ne m'inquiète pas du décalage réseau. Les autres modifications de la liaison par défaut sont dans l'élément de sécurité //, en particulier les attributs @mode et // transport/@ clientCredentialType.Lorsque vous récupérez le code XML, le numéro (stocké dans le champ PoG) figure dans l'attribut // z: row/@ ows_ID et son identifiant ADS correspondant se trouve dans l'attribut // z: row/@ ows_Name. . Vous récupérez également l'adresse e-mail dans l'attribut // z: row/@ ows_EMail.

Espérons que cela aidera les autres à traverser le même problème!

1

Malheureusement, l'ID indiqué dans les champs de site est local par rapport à la liste des utilisateurs par rapport à ce site. Chaque utilisateur est identifié de façon unique par le site et la liste avec le champ ID, mais l'ID n'est pas unique à travers les listes d'utilisateurs et ne peut donc pas être utilisé pour autre chose que l'indexation dans cette table.

L'autre problème avec ces données est que l'affichage du profil est mis à jour régulièrement par l'un des travaux du service UserProfileSynchronization. J'ai connu des moments où le nom d'affichage de l'utilisateur n'est pas mis à jour correctement et sera défini sur le nom de compte à partir d'Active Directory.

Pour avoir une idée de ce qui se passe sous le capot, jetez un coup d'œil à la table All_UserData dans une base de données de contenu.

En résumé

Seule la partie du nom du champ est utilisable de manière significative et même ce n'est pas totalement fiable, mais assez bon peut-être.

+0

La partie nom n'est pas utile dans mon cas. C'est pour un employeur avec environ 3000 employés - devinez combien de Mike Smiths nous avons. Je comprends que les identifiants peuvent changer au fil du temps - tout ce qui me tient à cœur est de pouvoir tirer une copie de la table d'utilisateur qui est utilisée au moment où je tire la liste d'origine. Je peux exécuter toutes les jointures nécessaires après avoir obtenu des copies locales des deux tables. – minameismud

0

Pouvez-vous modifier les champs exportés depuis SharePoint? Pouvez-vous ajouter un champ de personne calculé basé sur ce champ? Si tel est le cas, vous pouvez faire en sorte que ce champ Person stocke une autre forme de données personnelles, comme son nom d'utilisateur ou son adresse e-mail, qui sont beaucoup plus utiles pour interagir avec d'autres systèmes.

+0

Le champ PoG ne peut pas être utilisé comme argument dans un champ calculé. – minameismud