Nem sok olyan szörnyű dolog van az életben, mint egy korábban írt forráskódot újra elővenni, hogy valamit módosítsunk rajta. A dolog egy kicsit kellemesebb, ha a kódot nem más írta, de ha VB Scriptben van, akkor azt semmivel sem lehet ellensúlyozni!
Ma abba a problémába futottam bele, hogy egy korábban írt backup scriptet kellene frissíteni, ami a tanszéki Windows SharePoint Servicest menti le. Furdalt a kíváncsiság, hogyan lehetne megoldani a feladatot PowerShellel…
Először is be kell töltenünk a Microsoft.SharePoint.dll-t:
[system.reflection.assembly]::LoadWithPartialName( "Microsoft.SharePoint" )
Ha ez a válasz, akkor jó, a hallgatás hibát jelent 🙂
GAC Version Location --- ------- -------- True v2.0.50727 C:WINDOWSassemblyGAC_MSILMicrosoft.SharePoint12.0.0.0__71e9bce111e9429cMicrosoft.SharePo...
Kellene egy SPGlobalAdmin objektum:
$globaladmin = New-Object Microsoft.SharePoint.Administration.SPGlobalAdmin
Aki nem hiszi, hogy létrejött, csak írja be, hogy $globaladmin és valami hasonló lesz a válasz:
Config : Microsoft.SharePoint.Administration.SPGlobalConfig Version : 12.0.0.4518 AllowUnsafeUpdates : True ApplicationPools : {DefaultAppPool, Intranet Pool, SharePoint Central Administration v3, WSS Admin Pool} AdminPortUrl : http://maffia:4444/ AdminPortApplicationPoolId : SharePoint Central Administration v3 AdminPortIISInstanceId : 201702596 VirtualServers : {MAFFIA, MAFFIA, 152.66.251.54, MAFFIA...} VirtualServerNames : {Intranet Web Site} ConfigDatabase : Microsoft.SharePoint.Administration.SPConfigDatabase ConfigDatabaseServer : MAFFIA ConfigDatabaseName : IntranetConfigDB UseNtAuthenticationForDatabase : True ConfigDatabaseUser : UsageSettings : SPUsageSettings Parent=SPWebService Name=WSS_Administration OutboundSmtpServer : MAIL MailFromAddress : no-reply@aut.bme.hu MailReplyToAddress : no-reply@aut.bme.hu MailCodePage : 0 AdminFormDigest : 0xA2F82FA8DAE0854788585078B59D6C2AD84A69D5FFCC8ED01CC1430E1A597E5825B9889FC5D2871FA149 4111C72B52F0D248D4ED812A175485F5AC15B5A0AF7F,10 Sep 2007 17:32:09 -0000 AccountCreationModeEnabled : False InstalledLanguages : {Magyar} ServerLanguage : Microsoft.SharePoint.SPLanguage TimeZones : {39, 16, 15, 14...} UseHostHeaderAsSiteName : False
Tegyük el a gyökér webhely címét egy változóba:
$url = "https://maffia"
Nyissuk meg a címen elérhető SPVirtualServer objektumot:
$vserver = $globaladmin.OpenVirtualServer( $url )
Nézzük meg, hogy ez mit tud:
PS C:> $vserver IisWebSiteSettings : Microsoft.SharePoint.Administration.SPIisSettings WebApplication : SPWebApplication Name=Intranet Web Site Parent=SPWebService HostName : 152.66.251.54 Port : 80 Url : https://intranet/ CatchAccessDeniedException : False Sites : {a7b2b582-2017-49a7-8524-873d4aec27ae, ec4d8bdb-1ce7-427e-a0f1-3c5a9fc813d0, 7dc69ef5-ae41 -4afa-94d6-7f1b933509af, 2e764d06-842c-45d4-be57-ce6f28c9d110...} Config : Microsoft.SharePoint.Administration.SPVirtualServerConfig IISInstanceId : 2049022554 VirtualServerId : 32895ea5-1dc1-47ba-b25f-d9371aa50c0e Description : Intranet Web Site PresenceEnabled : True Version : 12.0.0.4518 State : Ready ApplicationPoolId : Intranet Site Pool OutboundSmtpServer : MAIL MailFromAddress : no-reply@aut.bme.hu MailReplyToAddress : no-reply@aut.bme.hu MailCodePage : 0 ContentDatabases :
Kérdezzük meg, hogy ennek az objektumnak milyen tulajdonságai vannak:
PS C:> $vserver | Get-Member -memberType property TypeName: Microsoft.SharePoint.Administration.SPVirtualServer Name MemberType Definition ---- ---------- ---------- ApplicationPoolId Property System.String ApplicationPoolId {get;} CatchAccessDeniedException Property System.Boolean CatchAccessDeniedException {get;set;} Config Property Microsoft.SharePoint.Administration.SPVirtualServerConfig Config {get;} ContentDatabases Property Microsoft.SharePoint.Administration.SPContentDatabaseCollection ContentDatabas... Description Property System.String Description {get;} HostName Property System.String HostName {get;} IISInstanceId Property System.Int32 IISInstanceId {get;} IisWebSiteSettings Property Microsoft.SharePoint.Administration.SPIisSettings IisWebSiteSettings {get;} MailCodePage Property System.Int32 MailCodePage {get;} MailFromAddress Property System.String MailFromAddress {get;} MailReplyToAddress Property System.String MailReplyToAddress {get;} OutboundSmtpServer Property System.String OutboundSmtpServer {get;} Port Property System.Int32 Port {get;} PresenceEnabled Property System.Boolean PresenceEnabled {get;} Sites Property Microsoft.SharePoint.Administration.SPSiteCollection Sites {get;} State Property Microsoft.SharePoint.Administration.SPVirtualServerState State {get;} Url Property System.Uri Url {get;} Version Property System.Version Version {get;} VirtualServerId Property System.Guid VirtualServerId {get;} WebApplication Property Microsoft.SharePoint.Administration.SPWebApplication WebApplication {get;}
A Sites tulajdonság érdekes számunkra, ugyanis az SPSiteCollection osztály tartalmaz egy Backup metódust és éppen arra van szükségünk. Megjegyzem az stsadm.exe is éppen ezt hívja. De előbb nézzük, mit tudunk a webhelyekről, pontosabban webhely gyűjteményekről, hiszen nem SPWeb, hanem SPSite objektumokkal dolgozunk. Bátran be lehet írni, hogy $vserver.Sites[0], hogy megnézzük, mit mond a PowerShell egy webhelyről és természetesen ezt is belecsövezhetjük a Get-Member pajtásba.
Kérhetünk egy átlátható listát a virtuális kiszolgálón található webhely gyűjteményekről:
PS C:> $vserver.Sites | Format-Table Url, RootWeb Url RootWeb --- ------- https://intranet BME AAIT Intranet https://intranet/courses/dotnet Csoportwebhely https://intranet/courses/portals Webportálok fejlesztése https://intranet/courses/SzofTechBSc A Szoftvertechnikák (BSc) tárgy munkaterülete https://intranet/projects/seagull Seagull Project https://intranet/projects/vjt Csoportwebhely https://intranet/projects/vmts Visual Modeling and Transformation System https://intranet/sites/eBooks Elektronikus könyvtár https://intranet/sites/mscorpevents Microsoft Nemzetközi Rendezvény Archívum https://intranet/sites/msevents Microsoft Hazai Rendezvény Archívum
Ebből rögtön látszik, hogy egyesek lusták átnevezni a webhelyüket. (Egyébként van itt egy csalás, ugyanis a RootWeb egy SPWeb típusú objektum, nem csak egy string.) A rendszergazda-lét előnye, hogy az ember retorziókat is alkalmazhat, például nem menti le a hanyag gazdik webhelyeit:
PS C:> $vserver.Sites | Where-Object{ $_.RootWeb.Title -ne "Csoportwebhely" } | Format-Table Url, RootWeb Url RootWeb --- ------- https://intranet BME AAIT Intranet https://intranet/courses/portals Webportálok fejlesztése https://intranet/courses/SzofTechBSc A Szoftvertechnikák (BSc) tárgy munkaterülete https://intranet/projects/seagull Seagull Project https://intranet/projects/vmts Visual Modeling and Transformation System https://intranet/sites/eBooks Elektronikus könyvtár https://intranet/sites/mscorpevents Microsoft Nemzetközi Rendezvény Archívum https://intranet/sites/msevents Microsoft Hazai Rendezvény Archívum
Egyetlen webhelyet így menthetünk le:
$vserver.Sites.Backup( "https://intranet/projects/seagull", "E:Backupsseagull.backup", $true )
A hátralévő részt mindenki el tudja képzelni: ForEach-Object segítségével ciklusba zavarjuk a metódushívást vagy függvényt gyártunk az egészből.
Már játszom egy ideje a PowerShellel, de még mindig tudok lelkesedni érte. A Windows Workflow Foundation vagy a SharePoint ennyi idő után már nem mert a szemem elé kerülni 🙂