Samstag, 19. Februar 2011

User Properties mit PowerShell anlegen und bearbeiten

Aus der Not geboren ( Die Not hat den Namen "CU December" und ich habe mich in diesem Post schon darüber ausgeheult :-) ) habe ich mich damit beschäftigt, wie man denn eigene User Properties in User Profiles automatisch befüllen und erstellen kann. Als Nicht- Developer und Admin denke ich dabei natürlich immer zuerst an die PowerShell! Dumm nur dass Microsoft offensichtlich vergessen hat uns dafür die nötigen Befehle direkt für die PowerShell einzupacken. Seltsam, da sich sicher jeder, der schon einmal die überwältigend träge, hässliche, langsame und undhandliche Maske zum administrieren der User Properties in SharePoint noch nie sehnlicher ein Power Shell- Skript gewünscht hat.
User Property Administration - ein Administrations-Alptraum wie aus den frühen 90ern.

Wir müssen uns des Objektmodells bedienen, um diese Eigenschaften über die PowerShell verwalten zu können. Die benötigte Klasse hierfür ist UserProfilManager ( http://msdn.microsoft.com/en-us/library/microsoft.office.server.userprofiles.userprofilemanager.aspx ).
Bauen wir uns also ein Skript, beginnen wir mit dem laden der SharePoint cmdlets und dem erstellen eines UserProfileManager-Objekts. Dieses Objekt beinhaltet alle Profile und Properties aus der Service Application, die im Kontext der angegebenen Seite verwendet wird.

  1. # Load Sharepoint SnapIn      
  2. if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)      
  3. {      
  4.     Add-PSSnapin Microsoft.SharePoint.PowerShell      
  5. }     
  6.     
  7. # Create Service Context      
  8. $site = Get-SPSite http://mySiteHostUrl      
  9. $serviceContext = Get-SPServiceContext $site     
  10.     
  11. # Get ProfileManager, User Profiles and User Properties      
  12. $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($serviceContext)      
  13. $userProfiles = $profileManager.GetEnumerator()      
  14. $properties = $profileManager.get_Properties()   
Nun haben wir eigentlich alles was wir dazu benötigen, neue User Properties anzulegen und bestehende Profile zu befüllen. Neue User Properties kann man wie folgt anlegen:
  1. # Create new Property   
  2. [Microsoft.Office.Server.UserProfiles.Property]$property = $properties.Create($false)   
  3. # Set property vaules   
  4. $property.set_Name("Property Name")   
  5. $property.set_Description("Property Description")   
  6. $property.set_DisplayName("Property Displayname")   
  7. $property.set_IsUserEditable($true)   
  8. $property.set_IsVisibleOnEditor($true)   
  9. $property.set_IsVisibleOnViewer($true)   
  10. $property.set_Type(String)   
  11. $property.set_Length(255)   
  12. # set other values you need...   
  13. $property.Commit()   
  14. # Add new Property to Repository   
  15. $properties.Add($property)  
Denkbar einfach, so eine property anzulegen, wenn man erstmal ein ProfileManagerObjekt hat. Das wichtigste hierbei ist eigentlich, den richtigen Typ ( set_Type() ) zu wählen ( String, Multi Value, etc...). Fast noch einfacher ist es dann, das User Property für jedes Profil befüllen zu lassen.

  1. foreach($userProfile in $userProfiles)   
  2. {   
  3.     # Set New Value   
  4.     $userProfile["Property Name"].Add("New Value")   
  5.     $userProfile.Commit()   
  6. }  
Ein solches Skript, vielleicht noch ein geplanter Windows Task und dazu die nötige Phantasie sollten eigentlich eine nützliche Lösung ergeben können :-) Viel Spaß damit!

Good luck,

Andreas


Mittwoch, 16. Februar 2011

CU Dezember, NetBiosEnabled, User Profile Sync und MIISRCW: System.NullReferenceExeption <- Neue Erkenntnisse

SOLVED WITH
CU FEBRURARY 20100



Na, NetBiosName unterschiedlich vom FQDN? Benutzerprofilsynchronisations-Dienstanwendung für den Import des NetBios Names aktiviert? Aktuell CU December installiert? Neue Import Connection notwendig? Pech gehabt! :-) Seit CU December dankt SharePoint das mit der Meldung Unable to process Create message ( oder Unable to process Put message wenn man versucht, eine bestehende Verbindung zu ändern ). Im Event Log sieht man dann eine Event ID 3:


ERROR:
"Unable to process create message"
EVENT LOG:
Forefront Identity Manager: Event ID 3
----------------------------------------------
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Calibri}
MIISRCW: System.NullReferenceException: Object reference not set to an instance of an object.
   at MIISRCW.IMMSMAUtility.UIGetData(String pszRequestInformation, Int32& pfSuccess, String& ppszResult)
   at Microsoft.ResourceManagement.SyncConfig.TryGetSchema(String maType, String initializationString, String& returnString)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.Create(String typeName, IList`1 createParameters, Guid creator, Guid cause)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.ActionProcessor.ActionDispatcher.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request, Guid requestIdentifier, Object redispatchSingleInstanceKey)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.ResourceManagementService.Create(Message request)
Na, da bleibt wohl nur das hoffen auf das nächste CU oder SP ( lt. diesem Forenverlauf stehts sogar seit 14. Februar auf der Liste von MS http://social.technet.microsoft.com/Forums/en/sharepoint2010setup/thread/e08b9564-05c0-4791-b8a2-e589834c4b7c ). Obwohl, langsam schleicht sich so ein unangenehmes Gefühl beim einspielen ein....

Good luck und immer auf dem neusten Patch-Level bleiben, höhöhö,


Andreas


P.S.: Wer nun wegen Terminen doch ne schnelle Lösung braucht: Wenn man den Account Name im Profil manuell ändert, wird er beim inkrementellen Import nicht mehr geändert...

Donnerstag, 3. Februar 2011

Duet Enterprise for SharePoint and SAP

Vorbei ist er - der Virtual Launch Event zu Duet Enterprise for SharePoint und SAP am 01. Februar 2010! Dabei sollte keiner, der sich schon den Kopf über SAP und SharePoint in der gleichen Problemstellung zerbrochen hat, sich voraussichtlich noch zerbrechen wird oder sich den Kopf von anderen Leuten darüber zerbrechen wird, dieses Event verpaßt haben. Ups, doch verpaßt? :-) Nicht schlimm, schnell hier anschauen:

http://www.duetenterprisesummit.com/SitePages/Agenda.aspx

Noch nie etwas von Duet Enterprise gehört? Das ist schnell erklärt:

Das, was Duet Enterprise ausmacht ist der Pfeil zwischen SAP NetWeaver und SharePoint. Der verbindet nämlich das Duet Enterprise SAP Add-on mit dem Duet Eterprise SharePoint Add-on. Und das bietet tolle Vorteile für ansonsten Recht interessante Dinge wie:
  • Single Sign On SAP Benutzer und Windows Benutzer,
  • Business Connectivity Services Entitäten OOTB, 
  • ...
 Somit sollte man in der Lage sein, ziemlich schnell sowas wie unten auf dem Bild zu basteln:

SAP HR, Empoyee Self Services in SharePoint? Kein Problem, Duet Enterprise ist ja jetzt mehr Framework als fertige Prozesse aus Duet 3.5 Zeiten... Also, schnell noch den Virtual Launch Event anschauen!

Good luck,

Andreas

Dokumente von Filesystem automatisch nach SharePoint importieren

Hallo zusammen,

anbei ein kleines PowerShell Skript, dass alle Dateien aus einem Ordner des Filesystems in eine SharePoint Liste importiert. Mir hat das Skript schon oft geholfen, ob als Hilfe für Datenmigration oder ob als geplanter Windows Tasks, der frisch eingescannte Dokumente regelmäßig importiert. Natürlich ist es möglich, automatisch Metadaten an die neu nach SharePoint hinzugefügten Dokumente anzufügen oder den Ersteller oder das Erstellungs-Datum vom Filesystem nach SharePoint zu importieren - aber Ihr werdet da schon die nötige Phantasie mitbringen :-)

  1. if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)   
  2. {   
  3.     Add-PSSnapin Microsoft.SharePoint.PowerShell   
  4. }   
  5.   
  6. $web = Get-SPWeb -Identity "http://sites/web/" ### Set your web URL   
  7. $folder = $web.GetFolder("http://site/web/list") ### Set your List URL here   
  8.   
  9.     foreach ($file in Get-ChildItem -Path "c:\folderwithdocuments") ### Set the location path of the folder with the documents here   
  10.     {   
  11.         $bytes  = [System.IO.File]::ReadAllBytes($file.Fullname)   
  12.         $SPDoc = $folder.Files.Add($file.Name,$bytes,$true)   
  13.         $SPDoc.Update()   
  14.         WRITE-HOST $file.FullName + " successfully added!" -ForegroundColor Green   
  15.     }   
  16. $web.Dispose()  

Ich hoffe es hilft!

Good luck,

Andreas