UML软件工程组织

部署企业模板
Infusion Development Corporation (http://www.infusiondev.com/)

2003 年 10 月

适用于:
    Microsoft® Visual Studio® .NET 2003

摘要:学习如何使用 Visual Studio .NET 2003 和 Active Directory 部署企业模板。(本文包含一些指向英文站点的链接。)

目录

介绍
企业模板文件
部署方法

简介

使用企业模板,建筑师和管理员可以改进和增强 Microsoft® Visual Studio® .NET 2003 中的项目结构及设计模式。企业模板规定了用户使用该模板创建项目时看到的项目骨架。有关在 Visual Studio .NET 中创建和设置企业模板的深入探讨,请参阅 Enterprise Templates Booklet(英文)。本文说明了企业模板周期中的最后一步:部署。

与其他软件组件一样,企业模板必须部署到要计算机上才能使用。对于模板,此过程主要是将相应的文件复制到 Visual Studio .NET 的子目录下。本文着重介绍可用来简化此过程的方法。突出介绍了如何使用 Active Directory 在可能拥有数百台计算机的企业环境中部署模板。

企业模板文件

企业模板由很多文件组成,这些文件用于指定模板的结构、约束和内容。如表 1 所示,这些文件必须复制到 Visual Studio .NET 主目录(我们将其表示为 %VSNETRoot%,通常位于 C:\Program Files\Microsoft Visual Studio .NET 2003)中的不同子目录下。

表 1:企业模板文件的位置

文件(或扩展名) 在 %VSNETRoot% 中的位置 用途
YourCustomHelpFile.xml Common7\IDE\HTML\XMLLinks\1033 Visual Studio .NET 参考此目录下的文件,以确定如何格式化动态帮助窗口。您可以在此目录下放置自定义的 XML 文件,以便为模板提供自定义帮助。(请注意,1033 是英语的语言代码,这与 Visual Studio .NET 的其他语言版本不同。)
.csproj、.vbproj 和 .vcproj(语言项目文件) EnterpriseFrameworks\Projects\SomeDir Visual Studio .NET 语言项目文件。项目文件指向一个真实的静态项目结构(由 Visual Studio .NET 为模板实例逐字重新创建),或者指向一个空的项目文件(JScript 向导代码将为其动态添加内容)。
.html 或 .hxs 用户定义的位置 模板的自定义帮助内容。这些内容可作为标准的 HTML (.html) 打包,或以 Microsoft 编译帮助格式 (.hxs) 打包。自定义帮助文件可位于任何目录下。
.tdl EnterpriseFrameworks\Policy 使用模板描述语言编写的模板策略文件,允许用户在创建模板实例时自定义、控制和限制 Visual Studio .NET 环境。
.etp EnterpriseFrameworks\Projects Visual Studio .NET 用于创建模板实例的主模板文件。
.js EnterpriseFrameworks\EFWizards Microsoft JScript® 文件与模板子项目向导一起使用。子项目向导允许您编写 JScript 代码,在 Visual Studio .NET 中创建模板的项目实例时将动态执行这些代码。实际上,子项目向导允许您在模板创建过程中插入自定义的编程操作。企业模板具有的灵活性大多归功于此功能。
.vsdir EnterpriseFrameworks\ProxyProjects Visual Studio .NET 参考 ProxyProjects 目录下的 .vsdir 文件来填写“添加新项目”和“新建项目”对话框中显示的项目选项。要向 Visual Studio .NET 提供自定义模板,必须创建一个自定义 .vsdir 文件并将其放在此目录下。
.vsz EnterpriseFrameworks\SomeDir .vsz 文件与子项目向导一起使用,其作用相当于指向执行编程操作的实际向导的“指针”。

部署方法

从本质上讲,部署企业模板就是将表 1 中列出的文件复制到各自相应的目录下。执行此操作的方法有很多种。本文介绍三种方法:批处理文件、Microsoft Installation (.MSI) 文件和通过 Active Directory 进行部署。无论采用哪种方法,部署过程都要遵循某些一般原则:

  • 部署应当是一个一步到位的过程,因为目标目录是可以通过推理获悉的,因此无需提示用户输入任何信息(自定义帮助文件除外,但即便是这些文件也可以放置在规定的目录下)。用户启动安装进程后,系统将正常地、无提示地复制模板文件。
  • 系统将在安装例程开始之前检查是否存在 Visual Studio .NET 2003。此操作可以通过检查注册表或 Visual Studio .NET 根目录来实现。
  • 安装过程不需要用户关闭任何打开的 Visual Studio .NET 实例(即便模板的某些方面,如自定义内容,需要重新打开 IDE 才能生效)。

方法 1:批处理文件

部署企业模板的方法之一是创建一个通过命令提示符执行的批处理文件(就是 Microsoft Windows® 时代之前的 DOS 系统下使用的那种批处理文件)。因为批处理文件实际上是一系列由 Windows 动态执行的编程操作,因此可以通过多种方法编写部署企业模板所需的批处理文件。列表 1 给出了一个例子。该批处理文件的第一个参数必须是 %VSNETRoot% 目录。

列表 1:AddTemplate.cmd:用来复制企业模板的批处理文件

@echo off

:: 确保已将 Visual Studio .NET 主目录作为参数传递:
if %1 == "" goto Usage

:: 映射包含企业模板文件的网络文件夹:
net use z: \\SomeComputer\SomeFolder

:: 确保所有 ET 子目录都存在:
if not exist %1                        goto NoNewTemplatesDirectory
if not exist %1\Policy                 goto NoNewPolicyDirectory
if not exist %1\EFWizards\MyWizard           goto NoNewEFWizardDirectory
if not exist %1\"CSharp Building Blocks"            goto 
  NoNewBuildingBlocksDirectory
if not exist %1\Projects               goto NoNewProjectsDirectory
if not exist %1\ProxyProjects          goto NoNewProxyProjectsDirectory

:: 创建用于存储新模板的目录:
mkdir %1\Projects\MyTemplate
mkdir %1\ProxyProjects\MyTemplateFolder

:: 复制模板文件:
xcopy z:\Policy\MyPolicy.TDL %1\Policy\ /s
xcopy z:\EFWizards\MyWizard\* %1\EFWizards\MyWizard\ /s
xcopy z:\"CSharp Building Blocks"\* %1\"CSharp Building Blocks"\ /s
xcopy z:\Projects\MyTemplate\* %1\Projects\MyTemplate\ /s
xcopy z:\ProxyProjects\MyTemplateFolder\* %1\ProxyProjects\MyTemplateFolder\ 
  /s

goto Exit

:: 显示批处理文件使用规则:
:用法
echo Usage: AddTemplates vsefdir newtemplatesdir
echo   Parameters:
echo   vsefdir - The EnterpriseFrameworks directory of the current Visual 
  Studio install
echo   newtemplatesdir - 包含 Visual Studio .NET 的目录 
  files.
echo                     这些文件应当存储在名为“Policy”、“Projects”和“ProxyProjects”的子目录
echo                     中的新模板目录下 

goto Exit

:NoNewTemplatesDirectory
echo 指定的 Visual Studio .NET 目录 %1 不存在。

goto Exit

:NoNewPolicyDirectory
echo 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 

goto Exit

:NoNewEFWizardDirectory
echo 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 

goto Exit

:NoNewBuildingBlocksDirectory
echo 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 

goto Exit

:NoNewProjectsDirectory
echo 指定的 Visual Studio .NET 目录 %1 中不存在
“Projects”子目录。

goto Exit

:NoNewProxyProjectsDirectory
echo 指定的 Visual Studio .NET 目录 %1 中不存在
“ProxyProjects”子目录。

goto Exit

:: 清理操作 - 从网络驱动器断开连接
:退出
net use z: /delete

列表 1 中的批处理文件只是所需的样板操作的一个示例,并未包括企业部署方案所需的强大的错误处理机制。此外,这里介绍的批处理文件需要用户指定 Visual Studio .NET 主目录的位置。理想情况下,完善的批处理文件应能够从注册表自动获取位置信息。批处理文件过程也存在一些普遍的缺点:

  • 无回滚过程(象 .MSI 文件中那样)。
  • 批处理文件的编程灵活性有限(例如错误处理)。
  • 无内置的提取/创建注册表项功能。

方法 2:Microsoft Installation (.MSI) 文件

Microsoft Installation (.MSI) 文件与 Microsoft Windows 安装程序配合工作。Microsoft Windows 安装程序最初打包在 Microsoft Windows 2000 和 Microsoft Windows Millennium 操作系统中(也可以作为 Microsoft Windows 95、Windows 98 以及 Microsoft Windows NT® 4.x 的再分发程序)。从 Windows 资源管理器或命令提示符下运行 .MSI 文件时,Windows 安装程序将执行内置的安装步骤。通常,这些步骤包含从用户那里收集安装参数(例如程序选项和/或目录位置),以及将程序文件复制到相应的目录。除了安装功能外,Windows 安装程序还可以执行卸载操作或从安装过程发生的错误中恢复。

Visual Studio .NET 的 Enterprise Developer 和 Enterprise Architect 版本中包含生成 .MSI 文件的功能。这是通过该环境提供的“设置和部署项目”类型完成的。本节将介绍如何使用 Visual Studio .NET 创建部署企业模板所需的 .MSI 文件。

相关内容:在 Visual Studio .NET 中安装和部署项目

在说明如何创建 .MSI 文件以部署企业模板之前,首先要介绍在 Visual Studio .NET 中创建安装项目的一般步骤。如图 1 所示,Visual Studio .NET 包含一个用于创建 .MSI 文件的“安装项目”模板。

图1:Visual Studio .NET 中的安装项目

使用此模板创建项目时,Visual Studio .NET 环境将显示为另一种独特的外观,如图 2 所示。

图 2:安装项目的 Visual Studio .NET IDE

图 2 的实现条件很简单:只需将组成应用程序的文件拖到 Application Folder 中(同时将图标快捷方式拖到用户桌面和用户程序菜单文件夹中)。当您在 Visual Studio .NET 中绑定项目时,该环境将生成一个包含拖动到 Application Folder 中的所有文件的 .MSI 文件,而不是生成 .EXE 文件或 .DLL 文件。当在其他计算机上执行 .MSI 文件时,Windows 安装程序将提示用户指定目标目录,然后将所有项目文件解压缩并复制到该目录下。

示例:在 Visual Studio .NET 中创建企业模板 .MSI

企业模板的安装与一般程序安装之间的不同之处在于事先已经知道目标目录(不用提示用户指定目录位置)。此外,必须在安装过程中从注册表中提取模板的目录位置(Visual Studio .NET 程序目录)。此方法比较复杂,需要在 Visual Studio .NET 中创建两个项目:

  • 一个安装项目,用于生成要部署到其他计算机上的 .MSI 文件。
  • 一个 Microsoft Visual Basic® .NET 应用程序,用于根据注册表确定 Visual Studio .NET 根目录,然后执行企业模板文件的实际复制工作。

这两个程序将协同工作,如下所述:

  1. 对于安装项目,需要将模板文件拖到 User's Personal Data Folder 中(下面将介绍此操作),而不是 Application Folder 目录中(参见图 2)。此文件夹将充当一个临时目录,Windows 安装程序会将模板文件解压缩到此目录下。
  2. 接下来,用户指示安装项目运行 Visual Basic .NET 应用程序。此应用程序将根据注册表确定 Visual Studio .NET 的根目录,然后将文件从上述临时目录 (User's Personal Data Folder) 复制到相应的 Visual Studio .NET 目录下。

下面介绍了创建以上两个项目的详细过程:

  1. 打开 Visual Studio.NET。
  2. File(文件)菜单中,指向 New(新建),然后选择 Project(项目)。
  3. New Project(新建项目)对话框中,在 Project Type(项目类型)窗格中选择 Visual Basic Projects(Visual Basic 项目),然后从 Templates(模板)窗格中选择 Windows Application(Windows 应用程序)。在 Name(名称)框中键入“MyInstaller”。
  4. 单击 OK(确定)按钮关闭对话框。该项目将被添加到解决方案资源管理器中。
  5. Project(项目)菜单中,选择 Add Module(添加模块),然后在 Add New Item(添加新项)对话框中选择 Module(模块)。将名称更改为“ActionModule.vb”,然后单击 Open(打开)按钮关闭对话框。
  6. 使用 Code Editor(源码编辑器)将列表 2 中的代码添加到 ActionModule.vb 中。此代码将根据注册表检索 Visual Studio .NET 根目录,然后将模板文件从临时目录移到 Visual Studio .NET 中并删除临时文件。

    列表 2:ActionModule.vb:用于复制企业模板文件的 Visual Basic .NET 代码

    Imports System.IO
    Imports System.IO.Path
    Imports System.IO.Directory
    Imports Microsoft.Win32
    
    Module ActionModule
        Public Sub Main()
            Dim destRoot As String
            Dim srcRoot As String
    
            Dim regLocal As RegistryKey = Registry.LocalMachine
            destRoot = 
              regLocal.OpenSubKey("SOFTWARE").OpenSubKey
              ("Microsoft").OpenSubKey("VisualStudio").OpenSubKey
              ("7.1").GetValue("InstallDir")
            destRoot = destRoot.Remove(destRoot.Length - 12, 12) & 
              "EnterpriseFrameworks"
    
            Dim regUser As RegistryKey = Registry.CurrentUser
            srcRoot = regUser.OpenSubKey("SOFTWARE").OpenSubKey
              ("Microsoft").OpenSubKey("Windows").OpenSubKey
              ("CurrentVersion").OpenSubKey("Explorer").OpenSubKey
              ("User Shell Folders").GetValue("Personal")
            srcRoot &= "\ET\"
    
            MoveFolder(srcRoot, destRoot)
        End Sub
    
        Public Sub CopyFile(ByVal fileIn As String, ByVal fileOut As 
          String)
            Dim fileReader As StreamReader
            Dim fileWriter As StreamWriter
            Dim str As String
    
            fileReader = File.OpenText(fileIn)
            fileWriter = File.CreateText(fileOut)
    
            While fileReader.Peek <> -1
                fileWriter.WriteLine(fileReader.ReadLine())
            End While
    
            fileReader.Close()
            fileWriter.Close()
        End Sub
    
        Private Sub MoveFolder(ByVal srcDirIn As String, ByVal destDirIn As 
          String)
            Dim srcDir As String
            Dim srcFile As String
            Dim srcFileInfo As FileInfo
            Dim destFileInfo As FileInfo
            Dim destDirInfo As DirectoryInfo
            Dim srcDirInfo As DirectoryInfo
    
            ' 如果提供的路径中不存在末尾分隔符,则添加末尾分隔符。
    
            If Not srcDirIn.EndsWith(DirectorySeparatorChar.ToString()) 
              Then
                srcDirIn &= DirectorySeparatorChar
            End If
    
            If Not destDirIn.EndsWith(DirectorySeparatorChar.ToString()) 
              Then
                destDirIn &= DirectorySeparatorChar
            End If
    
            ' 如果目标目录不存在,则予以创建。 
            destDirInfo = New DirectoryInfo(destDirIn)
            If destDirInfo.Exists = False Then destDirInfo.Create()
            destDirInfo = Nothing
    
            ' 从当前父目录中获取目录列表。 
            For Each srcDir In GetDirectories(srcDirIn)
                srcDirInfo = New DirectoryInfo(srcDir)
                destDirInfo = New DirectoryInfo(destDirIn & 
                  srcDirInfo.Name)
                ' 如果该目录不存在,则创建该目录。 
                If destDirInfo.Exists = False Then destDirInfo.Create()
                ' 由于我们处于递归模式下,因此还要复制子目录
                MoveFolder(srcDirInfo.FullName, destDirInfo.FullName)
                srcDirInfo = Nothing
                destDirInfo = Nothing
            Next
    
            ' 从当前父目录中获取文件。 
            For Each srcFile In GetFiles(srcDirIn)
                srcFileInfo = New FileInfo(srcFile)
                destFileInfo = New FileInfo(Replace(srcFile, srcDirIn, 
                  destDirIn))
    
                ' 如果文件不存在,则进行复制。 
                If destFileInfo.Exists = False Then
                    srcFileInfo.CopyTo(destFileInfo.FullName)
                End If
    
                srcFileInfo = Nothing
                destFileInfo = Nothing
            Next
        End Sub
    End Module
    
  7. 在解决方案资源管理器中,选择 MyInstaller 项目。从 Project(项目)菜单中选择 Properties(属性)。从 ActionModule Property Pages(ActionModule 属性页)对话框中选择 Startup(启动)对象属性,然后将其设置为 Sub Main。单击 OK(确定)按钮关闭对话框。
  8. Build(生成)菜单中选择 Build MyInstaller(生成 MyInstaller)。
  9. 您可以根据意愿删除 Form1.vb 文件,因为后面不再需要它。在 Solution Explorer(解决方案资源管理器)菜单中,右击 Form1.vb,然后选择 delete(删除)。单击 OK(确定)按钮,该文件将被删除。

然后将部署项目添加到 Visual Studio .NET 解决方案中:

  1. File(文件)菜单中,指向 Add Project(添加项目),然后选择 New(新建)。
  2. Add New Project(添加新项目)对话框中,从 Project Type(项目类型)窗格中选择 Setup and Deployment Projects(安装和部署项目),然后从 Templates(模板)窗格中选择 Setup Project(安装项目)。在 Name(名称)框中键入“CustomActionInstaller”。
  3. 单击 OK(确定)关闭对话框。将显示 File System Editor(文件系统编辑器)。
  4. File System Editor(文件系统编辑器)中,右击 File System on Target Machine(目标计算机上的文件系统)。选择 Add Special Folder(添加特殊文件夹),然后选择 User's Personal Data Folder(参见图 3)。此文件夹相当于用户的 My Documents 文件夹,将用作解压缩和复制文件的临时位置。

    图 3:向 Visual Studio .NET 中添加特殊文件夹

  5. 打开一个 Windows 资源管理器实例,然后浏览到包含企业模板文件的文件夹(最好将所有模板文件和文件夹复制到系统上给定的子目录中以便于访问)。
  6. 将这些文件拖到 User's Personal Data Folder 中。

接下来,在模板文件被解压缩到 User's Personal Data Folder 中之后,必须指示安装项目运行 Visual Basic .NET 程序。

  1. File System Editor(文件系统编辑器)中,右击应用程序文件夹。在 Action(操作)菜单中,指向 Add(添加),选择 Project Output(项目输出)。
  2. Add Project Output Group(添加项目输出组)对话框中,为 MyInstaller 项目选择 Primary Output(主输出)。单击 OK(确定)关闭对话框。
  3. 在解决方案资源管理器中,右击 CustomActionInstaller 项目。单击 View(视图)菜单,然后单击 Editor(编辑器),并从列表中选择 Customs Actions(自定义操作)。将显示 Customs Actions Editor(自定义操作编辑器)。
  4. Custom Actions Editor(自定义操作编辑器)中,右击 Install(安装)节点。在 Action(操作)菜单中,选择 Add Custom Action(添加自定义操作)。
  5. Select Item In Project(选择项目中的项)对话框中,双击 Application Folder(应用程序文件夹)。
  6. 选择 the Primary output from MyInstaller(MyInstaller 中的主输出)项。
  7. 单击 OK(确定)按钮关闭对话框。
  8. 在 Properties(属性)窗口中,选择 InstallerClass 属性,并将其设置为 false

接下来自定义项目的用户界面,使系统不再提示用户指定目标目录:

  1. 在解决方案资源管理器中,右击 CustomActionInstaller 项目。单击 View(视图)菜单,并从列表中选择 User Interface(用户界面)。将显示 User Interface Editor(用户界面编辑器)。
  2. Install(安装)区域内,右击 Installation Folder(安装文件夹)项,然后选择 delete(删除)。此窗体供开发人员选择目标文件夹,我们不需要这个文件夹,因此必须将其删除。
  3. Install(安装)区域内,右击 Confirm Installation(确认安装)项,然后选择 delete(删除)。
  4. Install(安装)区域内,选择 Welcome(欢迎)项。
  5. Properties(属性)窗口中,选择 WelcomeText 属性,并将其设置为适当的消息,例如:
    "The Enterprise Template is being copied and configured. Please wait."

  6. Install(安装)区域内,选择 End(结束)项。
  7. Properties(属性)窗口中,选择 UpdateText 属性,并将其设置为适当的消息,例如:
    "企业模板已成功移动到您的计算机上。
    该模板将显示在 Visual Studio .NET 的 New Project(新建项目)对话框中。"
    

最后,创建用于部署模板的 .MSI 文件:

  1. Build(生成)菜单中,选择 Build CustomActionInstaller(生成 CustomActionInstaller)。
  2. 可以将生成的文件 CustomActionInstaller.MSI 复制到其他计算机上,然后执行该文件以部署模板。

由此可见,由于 Visual Basic .NET 应用程序和安装项目之间的相互影响,创建部署企业模板所需的 .MSI 文件可能有些麻烦(请注意,也可使用其他方法,如 C# 控制台应用程序)。但是,由于为用户提供的安装过程十分简单(只包含一个 .MSI 文件),因此即使麻烦也是值得的。此外,由于 .MSI 文件是由 Windows 安装程序执行的,安装例程还自动包括卸载工具和错误恢复功能。最后介绍 .MSI 文件如何与下一个部署方案 Active Directory 一起工作。

方法 3:Active Directory

从 Windows 2000 开始引入的 Active Directory 使组织能够集中管理和共享网络资源信息。Active Directory 的功能之一是可以创建一个组策略,供管理员自定义最终用户的桌面环境。组策略的部分功能是提供了软件安装服务,使管理员可以在用户的计算机上安装软件。要利用软件安装服务,必须为活动域的组策略添加一个 .MSI 文件。MSI 文件将在用户下次登录时进行部署。

下面介绍了通过 Active Directory 利用软件安装服务的详细步骤:

  1. 运行 Active Directory Users and Computers(Active Directory 用户和计算机)管理单元。
  2. 找到要对其应用策略的组织单元。
    注意:对于不熟悉 Active Directory 的用户来说,组织单元是目录树的一个分支,代表组织中的一个逻辑分区。组织单元(及其中的目录对象,如用户、计算机、打印机和文件共享)继承了一定的安全属性(访问控制项或 ACE)。它们还可能继承组策略设置(除非组织单位已配置为拒绝策略继承),也可能已指定了自己的组策略对象 (GPO)。
  3. 单击 Action(操作)菜单,选择 Properties(属性)选项。
  4. Properties(属性)屏幕中,选择 Group Policy(组策略)选项卡。
  5. 选择 New(新建),为新的 Group Policy Object(组策略对象)命名(例如“Enterprise Template Distribution”)。
  6. 选择新的 Group Policy Object(组策略对象),然后单击 Edit(编辑)按钮。将显示 Group Policy(组策略)屏幕。
  7. Tree(树)选项卡中选择 User Configuration(用户配置),然后依次选择 Software Settings(软件设置)和 Software Installation(软件安装)。
  8. Action(操作)菜单中选择 New(新建),然后选择 Package(程序包)。将显示一个 Open(打开)窗口。
  9. 浏览到 MSI 文件的位置。单击 OK(确定)按钮。将显示 Deploy Software(部署软件)窗口。
  10. Deploy Software(部署软件)窗口中,选择 Assign(分配)选项。单击 OK(确定)按钮。
  11. 右击 MyInstaller(MSI 名称),然后选择 Properties(属性)。
  12. Properties(属性)窗口中,选择 Deployment(部署)选项卡。选中 Uninstall this application when it falls out of the scope of management(当这个应用程序不再处于管理范围内时,将其卸载),以及 Do not display this package in the Add/Remove Programs control panel(不要在“添加/删除程序”控制面板中显示这个程序包)。单击 OK(确定)按钮。
  13. 关闭 Group Policy Editor(组策略编辑器)。
  14. Organizational Unit Properties(组织单元属性)窗口中,选择 Group Policy(组策略)选项卡并按 Properties(属性)按钮。将打开 Enterprise Template Distribution Properties(企业模板分发属性)窗口。
  15. 选择 Security(安全性)选项卡并单击 Advanced(高级)按钮。将打开 Access Control Setting For Enterprise Template Distribution(企业模板分发的访问控制设置)窗口。在 Permissions(权限)选项卡中,找到 Authenticated Users with AppyGroupPolicy(通过 AppyGroupPolicy 身份验证的用户)权限。按 Remove(删除)按钮删除此项。
  16. 单击 Add(添加)按钮。将打开 Select User, Computer, or Group(选择用户、计算机或组)屏幕。选择要对其应用策略的用户或组。单击 OK(确定)按钮。
  17. 向下滚动 Permissions(权限)列表,找到 Apply Group Policy(应用组策略)。选中与其对应的 Allow(允许)框。
  18. 单击 OK(确定)按钮,关闭所有打开的屏幕。
  19. 等候组策略的刷新间隔结束,然后通知开发人员此项更新。

当面向大量计算机或开发人员时,适合使用 Active Directory 进行部署。它最大程度地简化了用户操作,用户只需注销或重新启动计算机。但是,此过程需要网络管理员的配合,并会在 EventLog 中显示错误消息。


版权所有:UML软件工程组织