Posts mit dem Label Power Shell werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Power Shell werden angezeigt. Alle Posts anzeigen

Freitag, 26. August 2011

SharePoint, PowerShell und Taxonomy

Eines der spannensten Features in SharePoint 2010 ist sicherlich der Managed Metadata Service und Taxonomien. Die Produktversion 2010 ist frisch mit diesem Feature bereichert worden. Daher ist gerade für Anwender, die schon ältere Produktversionen wie den Office SharePoint Server 2007 oder die Windows SharePoint Services 3.0 eingesetzt haben Umdenken angesagt! Hat man sich früher mit Auswahl- und Nachschlagefelder auf Schlagwortlisten beholfen, kann man heute Managed Metadata einsetzen! Dies erfordert allerdings auch neue Anforderungen an die Administration und schafft neue Herausforderungen bei der Migration - denn wer will schon die alten Notlösungen weiter verwenden, wenn er jetzt ein neues Feature dafür hat?! Die Erfahrung zeigt, dass man sich für solche Migrationen von alten Schlagwortspalten in Taxonomien oftmals am besten mit individuellen PowerShell Skripts behilft. Daher möchte ich im folgenden Skript- Beispiele für die häufigsten Anwendungsfälle bereit stellen.

  1. ####   
  2. # www.letssharepoint.com   
  3. ####   
  4.   
  5. # Get Taxonomy Session and Term Store   
  6. $site = Get-SPSite http://yoursiteurl   
  7. $taxonomySession = Get-SPTaxonomySession -site $site  
  8. $termStore = $taxonomySession.TermStores["Your Managed Metadata Service Application"]   
  9.   
  10. # Create Groups   
  11. $termStoreGroup = $termStore.CreateGroup("Your Groupname")   
  12. $termStoreGroup.Description = "Your Description"    
  13. $termStoreGroup.AddGroupManager("domain\user")   
  14. $termStoreGroup.AddContributor("domain\user")   
  15.   
  16. # Create Termset   
  17. $termSet = $termStoreGroup.CreateTermSet("Your Termset name")   
  18.   
  19. # Create Term   
  20. $term = $termSet.CreateTerm("Your Term Name", LanguageID)   
  21.   
  22. $termStore.CommitAll()  
Das Beispiel Skript oben zeigt, wie man sich gegen einen Term Store verbindet und neue Gruppne, Term Sets und Terms anleget. Zu beachten ist, das bei der Methode CreateTerm die LanguageID ausgetauscht werden muss!

  1. ####   
  2. # www.letssharepoint.com   
  3. ####   
  4.   
  5. # Load Microsoft.SharePoint.Taxonomy to work with TaxonomyFieldValueCollection   
  6. [Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Taxonomy")   
  7.        
  8. # Get Taxonomy Session and Term Store   
  9. $site = Get-SPSite http://yoursiteurl   
  10. $taxonomySession = Get-SPTaxonomySession -site $site  
  11. $termStore = $taxonomySession.TermStores["Your Managed Metadata Service Application"]   
  12.   
  13. # Get Web, List item and Taxonomy Field   
  14. $web = Get-SPWeb http://yourweburl   
  15. $list = $web.Lists["YourList"]   
  16. $item = $list.GetItemById(1)   
  17. $taxField = $item.Fields["YourTaxField"]   
  18.   
  19. # Create Taxonomy Field Collection for a Multi Managed Metadata Field   
  20. $taxCollection = new-object Microsoft.SharePoint.Taxonomy.TaxonomyFieldValueCollection $taxField  
  21.   
  22. ## Get Terms and Add them to the TaxonomyFieldValueCollection   
  23. # Get Term Group   
  24. $termStoreGroup = $termStore.Groups["My Group"]   
  25. # Get Term Set   
  26. $termSet = $termStoreGroup.TermSets["My Termset"]   
  27. # Get Terms    
  28. $term1 = $termSet.Terms["Term1"]   
  29. $term2 = $termSet.Terms["Term2"]   
  30. $term3 = $termSet.Terms["Term3"]   
  31. # Get TaxonomyFieldValues   
  32. $taxValue1 = new-object Microsoft.SharePoint.Taxonomy.TaxonomyFieldValue($taxField)   
  33. $taxValue1.TermGuid = $term1.Id   
  34. $taxValue1.Label = $term1.Name   
  35. $taxValue1.WssId = -1   
  36. $taxValue1 = new-object Microsoft.SharePoint.Taxonomy.TaxonomyFieldValue($taxField)   
  37. $taxValue2.TermGuid = $term2.Id   
  38. $taxValue2.Label = $term2.Name   
  39. $taxValue2.WssId = 0   
  40. $taxValue3 = new-object Microsoft.SharePoint.Taxonomy.TaxonomyFieldValue($taxField)   
  41. $taxValue3.TermGuid = $term3.Id   
  42. $taxValue3.Label = $term3.Name   
  43. $taxValue3.WssId = 1   
  44. # Add Values to Tyxonomy Field Value Collection   
  45. $taxCollection.Add($taxValue1)   
  46. $taxCollection.Add($taxValue2)   
  47. $taxCollection.Add($taxValue3)   
  48.   
  49. # Update Managed Metadata Colum on Item   
  50. $taxField = SetFieldValue($item$taxCollection)   
  51. $item.Update()  
Dieses Skript Beispiel zeigt, wie man eine Spalte vom Typ "Verwaltete Metadaten", welche mehrere Werte zulässt, befüllt. Im hier gezeigten Fall werden drei Werte in der Spalte gesetzt. Die WssId des TaxonomyFieldValues wird einfach hochgezählt, sofern das Feld noch nicht mit anderen Werten befüllt ist.

Good Luck,

Andreas

Donnerstag, 16. Juni 2011

Document Sets und PowerShell

Seit SharePoint 201ß erfreut sich jeder SharePoint Administrator über die PowerShell. Viele Verwaltungsaufgaben lassen sich nun durch Skripts automatisieren, aber auch einmalige Konfigurationen und Lösungen lassen sich einrichten. Sehr gerne verwende ich die PowerShell zur Dokumentenmigration aus dem Filesystem oder zur Neustrukturierung. An die Grenzen der vorhanden Cmdlets bin ich bei dem neuen Feature der Dokumentenmappen gestoßen - dafür gibt es nämlich keine! Das Erzeugen oder Ändern von Dokumentenmappen ist durch die mitgelieferten Cmdlets nicht möglich. Daher findet Ihr im folgenden Skript die Möglichkeit, Dokumentenmappen mit der PowerShell über das Objektmodel von SharePoint in der PowerShell anzulegen.

  1. ### Load SharePoint SnapIn   
  2. if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)   
  3. {   
  4.     Add-PSSnapin Microsoft.SharePoint.PowerShell   
  5. }   
  6. ### Load SharePoint Object Model   
  7. [System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)   
  8.   
  9. ### Get web and list   
  10. $web = Get-SPWeb http://myweb   
  11. $list = $web.Lists["List with Document Sets"]   
  12.   
  13. ### Get Document Set Content Type from list   
  14. $cType = $list.ContentTypes["Document Set Content Type Name"]   
  15.   
  16. ### Create Document Set Properties Hashtable   
  17. [Hashtable]$docsetProperties = @{"DocumentSetDescription"="A Document Set"}   
  18. $docsetProperties = @{"CustomColumn1"="Value 1"}   
  19. $docsetProperties = @{"CustomColum2"="Value2"}   
  20.     ### Add all your Columns for your Document Set   
  21.   
  22. ### Create new Document Set   
  23. $newDocumentSet = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet]::Create($list.RootFolder,"Document Set Title",$cType.Id,$docsetProperties)   
  24. $web.Dispose()  
Die Spaltenwerte der Dokumentenmappe werden durch die ab Zeile 16 erstellte Hashtable angelegt. Dabei werden die internen Spaltennamen angegeben. Wichtig ist auch, dass man den Inhaltstyp ( Content Type ) $cType aus der Sammlung der Liste auswählt und nicht aus der Sammlung des Webs. Ansonsten wird anstatt einer Dokumentenmappe nur ein neuer Ordner erstellt.
Als weite Methoden unter [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet] steht noch folgendes zur Verfügung:
Document Set Methoden

Mehr Details zu den Methoden findet man auch in der MSDN hier . Mit diesem Handwerkszeug sollte nichts mehr zwischen der PowerShell und Dokumentenmappen stehen!

Good Luck,

Andreas

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


Donnerstag, 3. Februar 2011

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

Mittwoch, 26. Januar 2011

Office Web Apps Administration

Hi,

alle wichtigen Office Dokumente im Browser anschauen - unabhängig von der Client Version. Mit Office Web Apps und SharePoint 2010 ist dieses Szenario sehr einfach realisiert. Die Installation und Konfiguration der Dienstanwendungen in SharePoint ist kein nennenswerter Aufwand. Auch die Administration ist für einen SharePoint Admin keine sehr großer Bedrohung - wenn man denn weiß was zu tun ist :-) Eine der Stellschrauben, die all zu oft vergessen werden ist der Cache der Office Web Apps. Office Web Apps laden jedes aufgerufene Dokument in den Cache - das erhöht die Geschwindigkeit des Renderings wesentlich! Nun kann man sich vorstellen, dass der Cache recht schnell einiges an Platz auf der Platte nimmt. Diesen Platz gilt es im Auge und unter Kontrolle zu halten!
Dafür gibt es einen lesenswerten TechNet Artikel. Zusammengefasst gilt es folgendes zu beachten:
  • Der Cache wird einmal pro Webanwendung angelegt,
  • der Cache wird automatisch in eine Websitesammlung abgelegt und somit in eine SharePoint Inhaltsdatenbank.
Eingestellt werden kann am Office Web Apps Cache:
  • Die maximale Größe,
  • das Ablaufdatum.
Mit beiden Einstellungen kann man schon dafür sorgen, dass einem der Cache nicht über den Kopf wächst. Nun will man den Cache aber auch nicht unbedingt in seiner produktiven Inhaltsdatenbank und somit auf seinen Datenbanksicherungen. Daher sollte in der Routine zum Anlegen einer neuen Webanwendung direkt enthalten sein, den Office Web Apps Cache in eine eigene Inhaltsdatenbank umzuziehen. Das kann man natürlich mit der PowerShell erledigen ( wie es der Artikel schon sehr gut beschreibt ).

Ich habe mir folgendes Skript daraus geschrieben, mit dem jeder Admin in der Lage sein sollte, die Wartung des Web Apps Caches vorzunehmen ohne sich die einzelnen Befehle suchen und bearbeiten zu müssen.




  1. if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)   
  2. {   
  3.     Add-PSSnapin Microsoft.SharePoint.PowerShell   
  4. }   
  5.   
  6.     $webAppUrl = Read-Host "URL of the Webapplication"  
  7.     $DBServer = Read-Host "Database Server"  
  8.     $CacheSize = Read-Host "Max Cache Size GB"  
  9.     $expirationDays = Read-Host "Expiration Period in Days"  
  10.        
  11.     Write-Host "..."  
  12.     Write-Host "Your Web Application: " -nonewline; Write-Host $webAppUrl -ForegroundColor Yellow    
  13.     Write-Host "Your Database Server: " -nonewline; Write-Host $DBServer -ForegroundColor Yellow    
  14.     Write-Host "Your Cache Size in GB: " -nonewline; Write-Host $CacheSize -ForegroundColor Yellow   
  15.     Write-Host "Your Expiration Time in days: " -nonewline; Write-Host $expirationDays -ForegroundColor Yellow   
  16.     Write-Host "..."  
  17.     $continue = Read-Host "Please confirm your input (y/n)"  
  18.   
  19.     if($continue -eq "y")   
  20.     {   
  21.         $webapp = Get-SPWebApplication -Identity $webAppUrl   
  22.         $DBName = "WSS_CONTENT_OfficeWebAppsCache_" + $webApp.Name   
  23.   
  24.         $newDB = New-SPContentDatabase -Name $DBName -WebApplication $webAppUrl -DatabaseServer $DBServer -MaxSiteCount 1 -WarningSiteCount 0   
  25.         Write-Host "New Content DB " -nonewline; Write-Host $DBname -ForegroundColor Yellow -NoNewline; Write-Host " created for Web Application " -nonewline; Write-Host $webapp.Name -ForegroundColor Yellow -NoNewline; Write-Host " on Database Server " -nonewline; Write-Host $DBServer -ForegroundColor Yellow -NoNewline; Write-Host "..."  
  26.         Get-SPOfficeWebAppsCache -WebApplication $webAppUrl | Move-SPSite -DestinationDatabase $newDB   
  27.         Write-Host "Move Office WebApps Cache Site Collection successfully to new ContentDB..."  
  28.         $GBSizeInBytes = 1024 * 1024 * 1024 * $CacheSize   
  29.         Get-SPWebApplication | Set-SPOfficeWebAppsCache -ExpirationPeriodInDays $expirationDays -MaxSizeInBytes $GBSizeInBytes   
  30.         Write-Host "Cache Byte Limit is set to " -nonewline; Write-Host $GBSizeInBytes -ForegroundColor Yellow -NoNewline; Write-Host " and Expiration Time to " -nonewline; Write-Host $expirationDays -ForegroundColor Yellow -NoNewline; Write-Host " days..."  
  31.         Write-Host "Operation completed successfully..." -ForegroundColor Green   
  32.     }   
  33.     else  
  34.     {   
  35.         Write-Host "The operation was chanceled by user input..." -ForegroundColor Red   
  36.     }   
Greift zu und speichert das Skript einfach als PS1 Datei ab. Aufrufen könnt Ihr es dann in der PowerShell mit dem Befehl C:\<Pfad>\<Dateiname>.ps1 .


Hoffentlich hilfts :-)

Good luck,

Andreas

Dienstag, 25. Januar 2011

SharePoint 2010 WarmUp Script

In der 2007er Version von SharePoint war ein WarmUp Skript für SharePoint, zum Beispiel dieses von Joel Oleson, Standard. Denn schon damals hatte es der IIS 6.0 an sich, die Webanwendungen Nachts zu recyclen und somit den Cache zu leeren. Der erste Seitenaufruf einer SharePoint-Seite ist nach dem leeren des Caches sehr langsam. Diese Problemstellung hat sich in Zeiten von IIS 7.5 und SharePoint 2010 nicht geändert. Nun gibt es ja für den IIS 7.5 WarmUp Plugin, für dessen Uninstall ich auch schon einen Blogpost geschrieben habe :-)
Die große Preisfrage ist: Was hab ich getan, nachdem das Plugin weg war? Ganz einfach, ich habe ein PowerShell Skript geschrieben, das durch jedes Web iteriert und über eine Webrequest jede Seite einmal aufruft. Das Skript wird durch eine geplante Windows Aufgabe von einem SharePoint Server ausgeführt.
Eine einfache Version eines solchen Skripts sieht folgendermaßen aus:



  1. Add-PsSnapin Microsoft.SharePoint.PowerShell -erroraction silentlycontinue  
  2.   
  3.  foreach ($webApp in get-SPWebApplication)  
  4.     {      
  5.         foreach ($site in $webApp.Sites)  
  6.         {  
  7.             foreach ($web in get-SPWeb -site $site)  
  8.             {  
  9.                 $request = [System.Net.WebRequest]::Create($web.URL)  
  10.                 $request.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials  
  11.                 $request.proxy = [System.Net.WebRequest]::DefaultWebProxy  
  12.                 $request.ContentType = "application/x-www-form-urlencoded"  
  13.                 $request.Method = "GET"  
  14.         try{  
  15.                     $request.GetResponse().StatusCode  
  16.             WRITE-HOST $request.GetResponse().StatusCode  
  17.                 }  
  18.                 catch [Net.WebException]{  
  19.                     $WebExceptionMessage = $_.Exception.Message  
  20.                     WRITE-HOST "Folgender Fehler ist aufgetreteb: " + $WebExceptionMessage  
  21.                 }  
  22.             }  
  23.         }  
  24.     }  
Im Gegensatz zu den Skripts, die ich beim meiner ersten Suche gefunden habe ist das oben erfrischend simpel und lädt zur phantasievollen Weiterentwicklung ein. Wer das ganze eher pragmatisch angeht, kopiert einfach den Code oben in eine Textdatei, speichert diese mit der Endung "ps1" und führt diese ps1 als Aktion im geplanten Windows Tasks einmal die Nacht nach zwei Uhr morgens aus. Beachtet dabei, dass das Skript nur auf einem SharePoint Server ausgeführt werden kann.

Good luck,

Andreas







Montag, 19. Oktober 2009

SharePoint 2010: Powershell 2.0 - the new stsadm

Goodbye stsadm - Welcome Power Shell 2.0!!! In the new SharePoint version Power Shell 2.0 replace the stsadm tool. Christian Glessner gives a early look on the new Cmdlets for SharePoint 2010 on his blog ILoveSharePoint, check out here.
Find a good example on the blog of Markus Alt.


Greeting,

Andreas