為了延展性的考慮,Windows Azure Cloud Services 並不會保存本機硬碟的狀態與設定,也因此所有對於系統內容的設定與軟體環境安裝都必須借助 Startup Tasks,讓虛擬機器啟動時自動執行些工作。 欲使用 Windows Azure Cloud Services Startup Task 必須在 Windows Azure Service Definition Schema (.csdef File). 內做相關的宣告。 HTTP://msdn.microsoft.com/en-us/library/windowsazure/gg456327.aspx 內有詳細的描述,例如我希望虛擬機器一啟動時便以系統管理員身分執行一個名為 global.cmd 的批次檔,並等待此批次檔執行完畢之後方可繼續執行,您可以在 ServiceDefinition.csdef 內加上下面 XML 宣告:
< ServiceDefinition name="MyService" xmlns="HTTP://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
< WebRole name="WebRole1">
< Startup>
<Task commandLine="global.cmd" executionCoNtext="elevated" taskType="simple">
</Task>
</Startup>
</WebRole>
< /ServiceDefinition>
但如何在 Starup Tasks 內設定地區與語言 (Regional and Language Options) 為臺灣呢? 這件事情比想像中麻煩些。 目前 (2012 年 10 月) Windows Azure Cloud Services 內虛擬機器的 Windows Azure Guest OS 作業系統是 Windows Server 2008 或 Windows Server 2008 R2,Windows Server 2008 支援 PowerShell 1.0,而 Windows Server 2008 R2 則支援 PowerShell 2.0。 這兩個版本的 Powershell 之內都沒有支援地區與語言的設定,因此要取代手動在控制台內設定地區與語言,需要採用其他的方法。
在 Windows XP 時代,即可透過命並列來進行地區與語言的設定,此方法最後的更新的檔是在 Windows Vista 時的 HTTP://msdn.microsoft.com/en-ie/goglobal/bb964650% 28en-us%29.aspx,例如我們可以將欲設定的地區與語言描述于 locale.xml 中,並在命令列內透過主控台 control.exe 加以執行與設定
control.exe intl.cpl,,/f:"locale.xml"
要將格式與地區都設定為臺灣,可以提供以下的 locale.xml
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/>
</gs:UserList>
<!--User Locale, change to Taiwan-->
<gs:UserLocale>
<gs:Locale Name="zh-TW" SetAsCurrent="true"/>
</gs:UserLocale>
<!--location, change to Taiwan ,GeoID of Taiwna is 237 -->
<gs:LocationPreferences>
<gs:GeoID Value="237"/>
</gs:LocationPreferences>
< /gs:GlobalizationServices>
XML 內的 CopySettingsToSystemAcct="true" 設定十分重要,因為即便將目前的系統管理員帳號區域設定修改成臺灣,但不代表啟動 IIS 的系統帳號 NT AUTHORITY\NETWORK SERVICE 會將區域設定修改成臺灣,必須將 CopySettingsToSystemAcct="true" 方會將主要系統帳號做相同的設定。
可以在 Windows Server 2008 R2 命令列模式中順利執行 control.exe intl.cpl,,/f:"locale.xml" 並不代表事情已經完成,我們必須將這個命令加入進 Windows Azure Cloud Se rvices Startup Task 之中。 由於這個區域設定的動作會干擾到虛擬機器啟動過程,因此我將 taskType="background」 改為在虛擬機器啟動的同時在背景同時執列區域設定的批次檔 global.cmd。 此外,這個 Startup Task 也會干擾開發環境的模擬器,讓開發環境無法順利將程式佈署到 Windows Azure Compute Emulator 模擬器,因此ServiceDefinition.csdef 內加上下面 XML 宣告 :
<WebRole name="WebRole1" vmsize="Small">
<Startup>
< Task commandLine="global.cmd" executionCoNtext="elevated" taskType="background">
<Environment>
< Variable name="EMULATED">
< RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
</Task>
</Startup>
</WebRole>