Web Deploy PowerShell Cmdlet

Owais Shaikh

Web Deploy V3.0 隨附 PowerShell Cmdlet,以執行 Web Deploy API [Microsoft.Web.Deployment] 所支援的大部分工作。 您可以在這裡深入瞭解此 API。 這些 Cmdlet 位於名為 WDeploySnapin3.0 的嵌入式管理單元中,其會在一般或更新版本的 Web 部署安裝上安裝並註冊為嵌入式管理單元。 若要使用這些 Cmdlet,請在每次啟動 PowerShell 控制台時新增嵌入式管理單元,或將嵌入式管理單元新增至 PowerShell 配置檔,讓所有控制台自動載入式管理單元。

若要在載入 PowerShell 控制台時新增,請在主控台視窗中執行下列命令:

Add-PSSnapin WDeploySnapin3.0

若要將它新增至 PowerShell 設定檔:

  1. 如果您已經有PowerShell配置檔,請移至步驟4。
  2. 在 [我的檔>] 底下<建立 WindowsPowerShell 資料夾。
  3. 建立名為 Microsoft.PowerShell_profile.ps1 的檔案
  4. 將這一行新增至 PowerShell 配置檔檔:'Add-PSSnapin WDeploySnapin3.0'

要注意的幾點:

  1. PowerShell 控制台在 64 位系統上以 64 位執行,並在 .Net 2.0 中執行,直到 Windows8 為止。 如果您遇到其中一個或兩者的問題,請參閱解決方案的疑難解答一節。
  2. 所有建立 Web Deploy 套件的 Cmdlet 都會建立最常見工作的參數,以及取用它接受參數值的 Cmdlet。
  3. 只有一個移除 Cmdlet 可用來刪除其下方的網站或應用程式。
  4. Web Deploy 具有參數,但它們與 PowerShell Cmdlet 參數是正交的。 本文件中參考參數時,表示 Cmdlet 參數。 Web Deploy 參數已特別稱為 Web Deploy 參數。

I. 發佈 設定 檔案

以下提供的所有 Cmdlet 都能夠針對遠端成品執行,例如遠端伺服器或遠端資料庫。 這些要求不只是認證。 例如,您需要遠端伺服器名稱、遠端資料庫 連接字串、是否要允許發行至具有測試證書的伺服器等等。為了方便使用,將認證資訊從伺服器管理員傳送到取用者等。新的檔類型已產生哪些檔案會將這些設定分組在一起。 此檔案稱為以 .publishsettings 結尾的發行配置檔。 這是由 Visual Studio 用於發布,以及由 WebMatrix 使用。

若要能夠建立這類檔案以供其他 Cmdlet 取用,並編輯它 New-WDPublish 設定 Cmdlet。 如果未指定檔名,則會在文件目錄中 <建立名為 new guid.publishsettings> 的新檔案。 建立檔案時會顯示此路徑。 如果指定了檔名,而且檔案不存在,則會如上述路徑所指定的資料夾中所述建立,但檔案的路徑必須有效。 如果檔案只存在您在執行命令時所指定的屬性值,除了檔案中的屬性未知且將會移除

範例:此範例會取得認證物件,然後將它連同其他參數一起傳遞至新的發佈配置檔 Cmdlet

$cred = Get-Credential
New-WDPublishSettings -ComputerName owais-1 -Site Site1 -Credentials $cred -AllowUntrusted -SiteUrl "https://www.mywebsite.com" -FileName C:\pprofiles\mywebsite.publishsettings -AgentType wmsvc
Get-WDPublishSettings cmdlet allows to load values from a publish setting file into PublishSettings object.
$publishsettings=Get-WDPublishSettings C:\pprofiles\mywebsite.publishsettings

II. Backup

所有備份 Cmdlet 都有一個位置參數(除了backup-wdserver之外的第二個位置參數,也就是第一個位置參數)稱為輸出。 這會採用您要建立備份的資料夾路徑。 備份一律是 Web Deploy zip 套件。 您可以在套件提供者深入瞭解 Web Deploy 套件。 如果未指定路徑,則會在使用者文件資料夾下的名為 'Web Deploy Backups' 的資料夾中建立備份。 備份會命名為 machinename_nameofproviderused_[Siteorapporfoldername(Optional)]_timestamp.zip。

除非遠端伺服器資訊是傳入 SourcePublish 設定 參數的發行配置檔,否則所有這些 Cmdlet 預設都會在本機運作。

A. IIS

所有 IIS Cmdlet 都會針對已安裝的 IIS 版本 7 或更新版本運作

1.伺服器

Backup-WDServer

描述:這沒有任何自變數會備份執行此命令的目前伺服器。 它會針對這項作業使用已知的 Web 伺服器提供者。 因此,建立的套件包含 Webserver 套件中包含的所有成品。 您可以在這裡深入瞭解此提供者

Cmdlet 參數:ConfigOnly 參數可讓您排除所有內容,而 SkipFileList 和 SkipFolderList 參數可讓您選擇性地從套件中排除一或多個檔案或資料夾。

範例:

這會備份網頁伺服器的所有內容,但內容除外:

Backup-WDServer -SourcePublishSettings c:\profiles\myserver.publishsettings -ConfigOnly

建立應該略過的檔案清單。 這是標準正則表達式。

$list = @('\\site2\\iisstart.htm','\\site2\\welcome.png')
Backup-WDServer –SkipFileList $list

您也可以將清單變更為 $list=@('\site2\') 以略過 site2 下的所有檔案

2. 網站

Backup-WDSite

描述:這會使用apphostconfig提供者備份 IIS 網站及其設定和內容。 您可以在這裡深入瞭解此提供者

Cmdlet 參數:會備份月台參數或發佈配置檔所指定的網站名稱。 站台參數值會覆寫網站名稱的發佈設定規格。

ConfigOnly 可用來建立沒有內容的備份。 如果網站使用非預設應用程式集區,則此套件在可能沒有相同應用程式集區的其他伺服器上運作,請使用 switch 參數 includeAppPool。 這會將應用程式集區組合到套件中。

自動產生的 Web Deploy 參數:會建立兩種類型的參數:

  1. 參數,可讓用戶變更將套用月臺備份的月臺名稱。
  2. 另一個參數可讓使用者變更網站和該網站下每個 Web 應用程式的實體路徑。

因此,如果我有一個網站,其下方有三個應用程式,我會分開取得 4 個實體路徑參數,以及一個網站名稱參數。

範例:

Backup-WDSite "Default Web Site" -ConfigOnly
Backup-WDSite MySite –IncludeAppPool
Backup-WDSite MySite -SkipFileList $list

3. Web 應用程式

Backup-WDApp

描述:這會使用 iisApp 提供者來備份 Web 應用程式。 在這裡深入瞭解此提供者。 以下是一篇很好的 文章 ,說明 Web 應用程式是什麼,以及網站、應用程式和 IIS 中的虛擬目錄之間的差異。

Cmdlet 參數:備份應用程式參數或發佈配置檔所指定的應用程式名稱。 如果沒有指定它們,則會擲回錯誤。 應用程式參數值會覆寫網站名稱的發佈設定規格。 SkipFileList 和 SkipFolderList 參數可讓您選擇性地從套件中排除一或多個檔案或資料夾。

自動產生的 Web Deploy 參數:建立用來在還原或安裝期間變更應用程式或網站名稱的參數。

$list = @('\\iisstart\.htm')
Backup-WDApp "Default web site/app" -SkipFileList $list

B. Database

1. MSSql

Backup-WDSqlDatabase

描述:這會使用 dbfullsql 提供者來備份 Microsoft SQL Server 資料庫。 此提供者會使用 SMO 來編寫資料庫的腳本,並公開超過 100 個提供者設定,以控制資料庫編寫腳本的方式。 這裡將詳細說明這一點

Cmdlet 參數:會備份發行配置檔中 Database 參數或 SQLServerDB 所指定的 連接字串 連線 ionString。 資料庫參數值會覆寫 SQLServerDB 的發行設定規格 連線 ionString。 這個 dbfullsql 提供者公開的提供者設定可以使用 Source 設定 參數傳遞。 其中一個非常常用的設定是 scriptdropsfirst,如果物件存在卸除物件腳本,則腳本會是腳本。 SMO 腳本選項的另一個提供者設定是將 scriptdata 設定為 false,以便只擷取架構。

自動產生的 Web Deploy 參數:會在還原或安裝期間建立參數來變更資料庫 連接字串

範例:

New-WDPublishSettings -ComputerName serverName -MSSqlConnectionString "Data Source=localhost;Initial Catalog=MyDb;User id=MyDbUser;Password=MyPassword" -FileName d:\SQLdb.PublishSettings -Credential serverName\Administrator
Backup-WDSQLDatabase -SourcePublishSettings D:\SQLdb.PublishSettings
Backup-WDSQLDatabase -Database "Data Source=localhost;Initial Catalog=MyDb;User id=MyDBUser;Password=MyPassword" -SourceSettings @{ copyAllUsers='false'; scriptDropsFirst='true'; }

2. MySql

Backup-WDMySQLDatabase

描述:這會使用 dbmysql 提供者來備份 MySql Server 資料庫。 此提供者會使用 mysqldump 來編寫資料庫的腳本。 這裡將詳細說明這一點

Cmdlet 參數:會備份發行配置檔中 Database 參數或 mySQLDB 所指定的 連接字串 連線 ionString。 資料庫參數值會覆寫 mySQLDB 的發行設定規格 連線 ionString。 提供者設定可以使用Source 設定參數傳遞。 常用的設定包括Data和 includeSchema。 根據預設,這些設定為 true。

自動產生的 Web Deploy 參數:會在還原或安裝期間建立參數來變更資料庫 連接字串

New-WDPublishSettings -ComputerName serverName -MySqlConnectionString "Data Source=localhost;database=MyDb;Uid=MyDbUser;pwd=MyPassword" -FileName d:\MySQLdb.PublishSettings -Credential serverName\Administrator
Backup-WDMySQLDatabase -Database 'Server=localhost;Database=MyDb;Uid=MyDbUser;pwd=MyPassword’
Backup-WDMySqlDatabase –SourcePublishSettings d:\mysqldb.publishsettings

III. 還原

所有還原 Cmdlet 都會採用 Web Deploy 套件來還原為第一個位置參數。

WebDeploy 支援封裝的參數化概念,可讓您在還原期間變更幾個層面(而不修改套件)。 例如,在還原期間,您可以選擇指定資料庫 連接字串 的值,這與使用 WebDeploy 參數的封裝內部不同(您必須 連接字串 套件中的參數。

根據套件的建置方式,Web Deploy 套件可能會有一或多個 參數。 這些還原 Cmdlet 會檢查套件,並將動態 PowerShell 參數新增至集合。 因此,如果套件具有名為 「Parameter1」 的 Web Deploy 參數,您就會找到名稱為 “Parameter1” 的 PowerShell 參數。 不過,動態參數在PowerShell中有自己的問題,只有在套件的名稱或檔案路徑中沒有空格時,才能運作。

或者,所有這些還原 Cmdlet 也有「參數」參數,可讓您在還原期間手動指定新的參數值。 這個 「參數」參數會針對 Web Deploy 參數的名稱值組,採用 PowerShell Dictionary 物件。

若要瞭解任何 Web Deploy 套件中定義的 Web Deploy 參數,您可以直接在 Windows 檔案總管中開啟 zip 檔案,並檢查套件根目錄中存在的parameters.xml檔案。 沒有任何預設值或值的任何 Web Deploy 參數都需要指定值。 在 xml 檔案中新增所有這些參數,並將它當做 ParameterValuesFile 參數的值傳入。 您可以依照這裡或手動方式產生此檔案。 格式為

<parameters>
  <setParameter name="name1" value="value1" />
  <setParameter name="name2" value="value2" />
</parameters>

Get-WDParameters Cmdlet 可以讀取此檔案,並將其轉換成 WebDeploy 參數物件 (dictionary),所有還原 Cmdlet 都接受此物件。

如果還原任何封裝而不指定 內參數的值,則預設行為會覆寫原本建立封裝的資源。 例如,如果我使用backup-wdsite site1 從site1建立套件,則當我使用 restore Cmdlet 還原此套件時,而不需為此套件中的參數提供任何值,site1 將會以任何套件包含、內容及設定的方式覆寫。所有還原 Cmdlet 也是如此。

除了指定目的地發佈配置檔時,所有這些 Cmdlet 都會在本機還原,在此情況下,會透過 Web Management Service (WMSvc) 或 Web 部署代理程式服務對遠端伺服器執行相同的確切作業。

A. IIS

1.伺服器

Restore-WDServer

描述:還原網頁伺服器套件。 常見的用法是先備份伺服器再進行變更,如果發生失敗,可以藉由套用在進行變更之前建立的 Web Deploy 備份套件來還原伺服器。

$folderList = @(‘\\app_data’)
Restore-WDServer D:\OWAIS-1_WebServer_20120419121214.zip -DestinationPublishSettings c:\destinationServer.publishSettings –SkipFolderList $folderList

2. 網站

Restore-WDSite

描述:還原 IIS 網站套件。 如果套件有兩個名為 「Site Physical Path」 和 「Site Name」 的參數,則會公開為 SitePhysicalPath 和 SiteName 動態 powershell 參數。 此命令會建立具有實體路徑 c:\site1的新月臺 site1。 如果未針對這些參數指定任何值,還原將會套用至相同的網站和內容,並覆寫您在網站中可能所做的任何變更。

參數:您可能想要使用 skipfolderlist 和 skipfilelist 來排除某些資料夾和/或檔案,使其無法複製到網站內容中。

Restore-WDSite C:\defaultsite.zip -SitePhysicalPath c:\site1 -SiteName site1
Restore-WDSite -Package 'D:\Users\Administrator\Documents\Web Deploy Backups\IIS-Server_AppHostConfig_Default Web Site_20120417100827.zip' -skipFolderList @('App_Data')  -verbose

3. 應用程式

Restore-WDApp

描述:這會還原 Web 應用程式。 Backup-WDApp 會使用一個參數建立套件,以在安裝時變更應用程式的名稱。 這可用來在還原期間將應用程式還原至不同的應用程式。 部署至月臺下的應用程式時,月台必須存在。 應用程式將會由此套件建立,但不會建立網站。

範例:

Restore-WDApp C:\myappbackup.zip -ApplicationPathParam1 "Default web site\app1"

B. Database

Restore-WDDatabase

描述:如果資料庫不存在,這會建立名為 customers 的新資料庫(只要目前使用者具有此作業的許可權),並在該資料庫上執行腳本。 如果這是在沒有動態 Web Deploy 參數的任何值的情況下執行,則會覆寫建立此套件的原始資料庫。 請注意,如果在建立封裝時未使用 scriptDropsFirst 設定,則套用至與現有內容衝突的資料庫將會失敗。 此 Cmdlet 可用來還原 MSSql 或 MySQL 備份。 您只能使用 Backup-WDSQLDatabase 和 My SQL Database 建立的備份還原 MS SQL 資料庫,以及使用 Backup-WDMySqlDatabase 建立的備份。

範例:

Backup-WDSqlDatabase "server=.\sqlexpress;integrated security=SSPI;database=customers" "C:\dbbackup.zip"
Restore-WDDatabase c:\dbbackup.zip –DatabaseConnectionStringParam1 "server=.\sqlexpress;integrated security=SSPI;database=customers_copy"
Backup-WDMySqlDatabase "server=localhost;uid=someuser;pwd=somepwd;database=coolDb" "C:\dbbackup.zip"
Restore-WDDatabase c:\dbbackup.zip –DatabaseConnectionStringParam1 "server=localhost;uid=someuser;pwd=somepwd;database=coolDb_copy"

C. 泛型套件

Restore-WDPackage

描述:此 Cmdlet 可用來套用任何 Web Deploy 套件。 有數種方式可以建立或取得 Web Deploy 套件,例如下載 開放原始碼 應用連結庫套件、在 Visual Studio 中建立套件、使用msdeploy.exe命令行工具(詳細資訊),或使用檔稍早記的 Backup-WD* Cmdlet。 例如,若要在 IIS Server 預設網站上安裝 wordpress,做為名為 wordpress 的應用程式,請將 wordpress 套件從 應用連結庫 下載到名為 packages 的資料夾。 wordpress 套件參數的所有預設值都會如往般運作,但只需要指定兩個必要參數的值:admin 和非 admin mysql 密碼。

參數:

Restore-WDPackage c:\Packages\wordpress.zip -DBAdminPassword mysecretserverpassword –DBPassword mysqllocalpassword

IV. 移除

Remove-WDSite -Site NonWorkingSite

此命令將會刪除 applicationHost.config 中名為 nonworkingsite 定義的網站,以及網站的目錄內容

V. 取得及設定應用程式集區架構

這些 Cmdlet 可讓您讀取和變更 apppool .net Framework 版本。

Get-WDAppPoolFx "default web site"
managedRuntimeVersion
---------------------
v2.0
Set-WDAppPoolFx "default web site" -AppPoolFrameworkVersion v4.0
Get-WDAppPoolFx "default web site"
managedRuntimeVersion
---------------------
v4.0

VI. 設定 WDACL

此 Cmdlet 可用來在網站的內容上設定 acls。 例如,假設我有一個網站、site1,而且我嘗試提供使用者 u1 讀取許可權。

首先,我檢查目前的許可權。

$ret = Get-Acl C:\site1
$ret.Access
I don’t see u1 in the list. Let me give the user u1 access as follows
Set-WDAcl "site1" -SetAclUser u1
Check whether this worked
$ret = Get-Acl C:\site1
$ret.Access
I see that u1 has been given read access as below. [I have not pasted the other permissions on this folder. Just the u1 part]
FileSystemRights  : Read, Synchronize
AccessControlType : Allow
IdentityReference : MOSHAIKH1\u1
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

七。 Invoke

您可以使用 destinationpublishsettings 在遠端系統上叫用命令或腳本,並即時查看遠端執行的結果。 您必須是遠端系統上的系統管理員,才能從遠端執行 runcommand 提供者。 您可以在這裡深入瞭解此提供者。 MWD Api 等候指定文稿或命令完成的預設最大時間為 5 秒。 如果您想要增加這次執行時間,您可以為 waitInterval 和 waitAttempts 指定較高的值,如下列範例所示。

A. 指令碼

Invoke-WDScript C:\my.cmd –Verbose

這會執行文稿,如果您以詳細資訊執行命令,您將能夠看到命令的輸出。

B. Command

$settings = @ { waitInterval = 3000; waitAttempts = 25;}
Invoke-WDCommand "dir c:\mydirectory /s/b" -DestinationSettings $settings

這會執行 命令,而且不會顯示任何輸出,因為未指定詳細資訊。 不過,這會在每次逾時之間等候 3 秒,而且會執行 25 次等候的反覆專案。 畢竟,進程執行最多會持續 75 秒。

八。 Sync

這些 Cmdlet 會取得來源和目的地,並在兩者之間進行同步處理。 永遠不會修改來源。 我之所以使用來源而非用戶端一詞,是因為客戶端和伺服器在同步處理中非常令人困惑。 您可以將本地伺服器與遠端伺服器同步處理。 在此情況下,遠端伺服器是來源,而本地伺服器是目的地。 或者,您可以在機器 1 和同步處理電腦 2 和 3 上執行 PowerShell Cmdlet。 若要使用遠端來源和/或目的地,您必須提供發行配置檔,您可以使用本檔中提及的第一個 Cmdlet 來建立。所有同步 Cmdlet 也都支援 source 設定 和 destination 設定 參數,以便選擇性地設定來源或目的地的提供者設定。

A. IIS

1.伺服器

我想要同步處理兩部 IIS 7.5 伺服器:Owais-1 和 Owais-2。 我會先為每個建立一個 publishsettings 檔案,然後同步處理伺服器。 因為我沒有指定我的認證,如果我是這兩個系統上的系統管理員,這將會成功。

New-WDPublishSettings -ComputerName owais-1 -AgentType MSDepSvc -FileName c:\owais1.publishsettings
Publish settings file created at: 'c:\owais1.publishsettings'.
New-WDPublishSettings -ComputerName owais-2 -AgentType MSDepSvc -FileName c:\owais2.publishsettings
Publish settings file created at: 'c:\owais2.publishsettings'.
Sync-WDServer -SourcePublishSettings c:\owais1.publishSettings -DestinationPublishSettings c:\owais2.publishSettings

2. 網站

在下列命令中,如果site2不存在,則會建立site2,而且我也已變更實體路徑(因此內容會複製到新資料夾 c:\site2),以及網站的系結。

Sync-WDSite site1 Site2 -SitePhysicalPath c:\site2 -SiteBinding "*:8078:" -IncludeAppPool

3. 應用程式

我有一個在默認網站下執行的應用程式。 我想在 Site1 下行動這個。 下列命令會執行此動作。

Sync-WDApp "Default Web Site/drupal" "site1/drupal"

現在,我已經測試了新的 Drupal 應用程式可運作,我會刪除預設網站下的原始 Drupal 應用程式。

Remove-WDSite "Default Web Site/drupal"

B. Database

先前的 Cmdlet 示範如何使用 Web Deploy 套件來備份和還原資料庫,不過您也可以使用 Sync-WDSQLDatabase 和 Sync-WDMySQLDatabase Cmdlet,將資料庫同步至.sql腳本或直接同步至另一個資料庫實例。

1. MSSql

Sync-WDSQLDatabase "server=.\sqlexpress;uid=sa;pwd=********;database=umbracodb" "server=.\sqlexpress;uid=sa;pwd=************;database=sometestdb"

這會建立名為 sometestdb 的新資料庫(如果尚未存在),並同步架構和數據。

Sync-"server=.\sqlexpress;uid=sa;pwd=********;database=umbracodb"  c:\umbraco.sql

這會將 umbracodb 資料庫腳本化為上述路徑的 umbraco.sql。

2. MySql

Sync-WDMySQLDatabase "server=localhost;uid=root;pwd=********;database=wordpress265" "server=localhost;uid=root;pwd=************;database=wordpress265_new"

這會建立名為 wordpress265_new 的新資料庫(如果尚未存在),並同步架構和數據。

Sync-WDMySQLDatabase "server=localhost;uid=root;pwd=***************;database=wordpress265" c:\wordpress.sql

這會將 wordpress265 資料庫腳本化為上述路徑的 wordpress.sql。

C. 其他所有項目

針對上述其他 Cmdlet 未涵蓋的一般用途同步處理,您可以使用 Sync-WDManifest Cmdlet。 這是MWD API 支援的一般指令清單提供者同步處理。 您可以在 此處閱讀相關資訊。 指令清單是 xml 檔案中的提供者、提供者路徑和提供者設定的集合。 結構是 xml 檔案的根節點會被視為提供者的名稱,以供目前同步處理之用。因此,它不能是此處清單中所指定之任何已知提供者的名稱。 然後,它可以有子節點,其項目名稱符合您想要包含在同步處理中的提供者。path 屬性代表該提供者的路徑,而且這是必要的。 然後,針對您想要針對目前同步作業運用的每個提供者設定,新增屬性值組。

此 Cmdlet 需要兩個指令清單:一個用於來源,另一個用於目的地。 指令清單一律會以指定的順序執行。 如果提供者支援與 IIS 網站搭配運作的 apphostconfig 提供者等認可作業,除非同步處理完成,否則不會呼叫認可。 因此,如果您有一個提供者,預期網站存在於建立網站的提供者之後,則這會失敗,因為網站尚未認可。 在下列範例中,我將同步處理應用程式,並在指令清單中包含應用程式所使用的資料庫。

來源指令清單:

<demoManifest>
  <iisApp path="Site1" />
  <dbfullsql path="server=.\sqlexpress;integrated security=SSPI;database=customers" />
</demoManifest>

目的地指令清單:

<demoManifest>  <iisApp path="Site2" />  <dbfullsql path="server=.\sqlexpress;integrated security=SSPI;database=customers_demo_cpy" /></demoManifest>Sync-WDManifest C:\sourceManifest.xml C:\destManifest.xmlWARNING: Cannot connect to the database 'customers_demo_cpy'.Retrying operation 'Add' on object dbFullSql (server=.\sqlexpress;uid=sa;database=customers_demo_cpy). Attempt 1 of 5.Manifest         : C:\sourceManifest.xmlManifest-Dest    : C:\destManifest.xmlTimeTaken        : 0:10Errors           : 0Warnings         : 0BytesCopied      : 0ObjectsDeleted   : 0ObjectsUpdated   : 0ObjectsAdded     : 3TotalChanges     : 3ParameterChanges : 0