为了延展性的考虑,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 Services 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>