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 🙂