
当您有数百台服务器时,通过PowerShell期望状态配置(DSC)可以轻松部署和配置操作系统,服务器角色和应用程序。
但是当在本地使用DSC时,即 在MS Azure中没有,但是有一些细微差别。 如果组织规模较大(有300个工作站和服务器)并且尚未打开容器世界,则它们特别有形:
- 没有关于系统状态的完整报告。 如果所需的配置没有应用到任何服务器上,那么如果没有这些报告,我们将一无所知。 从内置的报表服务器获取信息非常困难,而且对于大量主机而言,这也是很长的时间。
- 没有可伸缩性和容错能力。 不可能构建一个轮询DSC Web服务器场,该服务器场将具有单个容错数据库以及一个公共的mof配置文件,模块和注册密钥存储库。
今天,我将告诉您如何解决第一个问题并获取报告数据。 如果SQL可以用作数据库,那么一切都会更简单。 MS
承诺仅在Windows Server 2019或Windows Server 1803构建版本中提供内置支持。由于DSC服务器使用OleDbCommand不完全支持的命名参数,因此它也
将无法使用OleDB提供程序
来检索数据。
我发现了这种方式:对于使用Windows Server 2012和2016的用户,可以将SQL数据库
配置为轮询DSC服务器的后端。 为此,请创建带有链接表的.mdb文件形式的“代理”,该代理将将从客户端报告接收的数据重定向到SQL Server数据库。
注意:对于Windows Server 2016,您必须使用AccessDatabaseEngine2016x86 ,因为不再支持Microsoft.Jet.OLEDB.4.0。我不会详细介绍轮询DSC服务器的部署过程,
这里将对此进行详细介绍。 我只注意几点。 如果我们将轮询DSC部署在具有WSUS或Kaspersky Security Center的同一Web服务器上,那么在配置创建脚本中,必须更改以下参数:
UseSecurityBestPractices = $false
否则,将禁用TLS 1.0,您将无法连接到SQL数据库。 Kaspersky Security Center也不起作用(该问题应在Kaspersky Security Center v11中解决)。 Enable32BitAppOnWin64 = $true
如果不进行此更改,则无法使用WSUS在IIS上启动AppPool DSC服务器。- 使用WSUS安装DSC服务器时,请为DSC站点禁用静态和动态缓存。
让我们继续设置DSC服务器以使用SQL数据库。
创建一个SQL数据库
- 创建一个名为DSC的空SQL数据库。


- 创建一个帐户以连接到该数据库。 预先验证是否在SQL Server上启用了Windows和SQL帐户的身份验证。


- 转到“用户映射”部分。 选择一个数据库,在这种情况下为DSC。 我们赋予数据库所有者的权利。

- 做完了

为DSC数据库创建架构
有两种方法可以为DSC数据库创建架构:
- 通过TSQL中的脚本独立运行
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Devices]( [TargetName] [nvarchar](255) NOT NULL, [ConfigurationID] [nvarchar](255) NOT NULL, [ServerCheckSum] [nvarchar](255) NOT NULL, [TargetCheckSum] [nvarchar](255) NOT NULL, [NodeCompliant] [bit] NOT NULL, [LastComplianceTime] [datetime] NULL, [LastHeartbeatTime] [datetime] NULL, [Dirty] [bit] NOT NULL, [StatusCode] [int] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[RegistrationData]( [AgentId] [nvarchar](255) NOT NULL, [LCMVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [ConfigurationNames] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[StatusReport]( [JobId] [nvarchar](50) NOT NULL, [Id] [nvarchar](50) NOT NULL, [OperationType] [nvarchar](255) NULL, [RefreshMode] [nvarchar](255) NULL, [Status] [nvarchar](255) NULL, [LCMVersion] [nvarchar](50) NULL, [ReportFormatVersion] [nvarchar](255) NULL, [ConfigurationVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL, [Errors] [nvarchar](max) NULL, [StatusData] [nvarchar](max) NULL, [RebootRequested] [nvarchar](255) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
- 通过SQL数据导入向导,从空devices.mdb导入数据作为PS模块PSDesiredStateConfiguration的一部分。
我们将使用的Devices.mdb位于C:\ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ Modules \ PSDesiredStateConfiguration \ PullServer。
- 若要导入数据,请运行SQL Server导入和导出向导。

- 我们选择从何处收集数据-在我们的例子中,这是一个Microsoft Access数据库。 单击下一步。

- 从我们导入方案的位置选择文件。

- 我们指出要导入的位置-我们有此SQL数据库。

- 我们选择SQL服务器(服务器名称)和要将数据导入其中的数据库(数据库)。

- 我们选择选项从一个或多个表或视图复制数据(从表或视图复制数据)。

- 我们选择要从中导入数据库模式的表。

- 选中立即运行,然后单击完成。

- 做完了

- 结果,表应该出现在DSC数据库中。

配置.mdb“代理”文件
创建与SQL Server的ODBC连接。 假定未在装有DSC的服务器上安装MS Access,因此,在安装了MS Access的中间主机上执行database.mdb配置。
让我们创建一个与SQL Server的系统ODBC连接(连接的位深度必须与MS Access的位深度匹配-64或32)。 可以使用以下方法创建它:
-Powershell cmdlet:
Add-OdbcDsn –Name DSC –DriverName 'SQL Server' –Platform '<64-bit or 32-bit>' –DsnType System –SetPropertyValue @('Description=DSC Pull Server',"Server=<Name of your SQL Server>",'Trusted_Connection=yes','Database=DSC') –PassThru
-或使用连接向导手动进行:
- 打开管理工具。 我们根据安装的MS Access版本选择ODBC数据源。 转到系统DSN选项卡并创建系统连接(添加)。

- 我们指示将连接到SQL Server。 单击完成。

- 指定名称和要连接的服务器。 然后,需要在DSC服务器上创建具有相同参数的连接。

- 我们指示要连接到SQL Server,我们使用先前创建的名称为DSC的登录名。

- 在DSC连接设置中指定数据库。

- 单击完成。

- 在完成设置之前,我们验证连接是否正常(测试数据源)。

- 做完了

在MS Access中创建devices.mdb数据库。 我们启动MS Access并创建一个名为devices.mdb的空数据库。

- 转到“外部数据”选项卡,单击“ ODBC数据库”。 在出现的窗口中,选择“创建链接表以与数据源通信”。

- 在新窗口中,选择“机器数据源”选项卡,然后单击“确定”。 在新窗口中,输入用于连接到SQL Server的凭据。

- 我们选择需要链接的表。 我们选中“保存密码”复选框,然后单击“确定”。 每次都要为所有三个表保存密码。

- 在索引中,您需要选择以下内容:
-dbo_Devices表的TargetName;

-dbo_RegistrationData的NodeName或IPAddress;

-dbo_StatusReport的NodeName或IPAddress。

- 重命名MS Access中的表,即:删除dbo_前缀,以便DSC可以使用它们。

- 做完了

- 保存文件并关闭MS Access。 现在,将生成的devices.mdb复制到DSC服务器(默认情况下,在C:\ Program Files \ WindowsPowershell \ DSCService中),并将其替换为现有的(如果有)。
配置DSC服务器以使用SQL
- 我们返回到DSC服务器。 要使用我们的代理文件连接到SQL Server,请在DSC服务器上创建一个新的ODBC连接。 名称,位深和连接设置应与创建MDB文件时相同。 您可以从此处复制已配置的空devices.mdb。
- 要使用devices.mdb,您需要更改轮询DSC服务器的web.config(默认情况下,C:\ inetpub \ PSDSCPullServer \ web.config):
-适用于Windows Server 2012
<add key="dbprovider" value="System.Data.OleDb"> <add key="dbconnectionstr" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\WindowsPowerShell\DscService\Devices.mdb;">
-适用于Windows Server 2016
<add key="dbprovider" value="System.Data.OleDb"> <add key="dbconnectionstr" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Program Files\WindowsPowerShell\DscService\Devices.mdb;">
这样就完成了DSC服务器的设置。
检查DSC服务器的运行状况
- 检查是否可以通过Web浏览器访问DSC服务器。

- 现在,让我们检查轮询DSC服务器是否正常工作。 为此,xPSDesiredStateConfiguration模块具有pullserversetuptests.ps1脚本。 在运行此脚本之前,必须安装名为Pester的Powershell模块。 安装它Install-Module -Name Pester。
- 打开C:\ Program Files \ WindowsPowerShell \ Modules \ xPSDesiredStateConfiguration \ <模块版本> \ DSCPullServerSetup \ PullServerDeploymentVerificationTest(在示例中为8.0.0.0.0版)。

- 打开PullServerSetupTests.ps1并检查DSC服务器的web.config的路径。 红色突出显示了web.config的路径,它将检查脚本。 如有必要,请更改此路径。

- 运行pullserversetuptests.ps1
Invoke-Pester。\ PullServerSetupTests.ps1
一切正常。

- 在SQL Management Studio中,我们看到托管主机将报表发送到DSC报表服务器,并且数据转到SQL Server上的DSC数据库。

仅此而已。 在以下文章中,我计划告诉您如何在接收到的数据上生成报告,并且我将涉及有关容错性和可伸缩性的问题。