Skip to content

Commit 634fef0

Browse files
authored
Refactored 22 - Policy Based Management
1 parent 8a19d5e commit 634fef0

File tree

1 file changed

+288
-0
lines changed

1 file changed

+288
-0
lines changed

Scripts/22_Policy_Based_Mgmt.ps1

Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
<#
2+
.SYNOPSIS
3+
Gets the Policy Based Mgmt Objects on the target server
4+
5+
.DESCRIPTION
6+
Writes the Policies and Facets out to the "22 - PBM" folder
7+
8+
.EXAMPLE
9+
22_Policy_Based_Mgmt.ps1 localhost
10+
11+
.EXAMPLE
12+
22_Policy_Based_Mgmt.ps1 server01 sa password
13+
14+
.Inputs
15+
ServerName\instance, [SQLUser], [SQLPassword]
16+
17+
.Outputs
18+
19+
20+
.NOTES
21+
https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.dmf.aspx
22+
https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.facets.aspx
23+
24+
Feb 1, 2021 - Switched to building SQL statements with SQL as the SMO libraries are trash
25+
26+
.LINK
27+
https://github.com/gwalkey
28+
29+
#>
30+
31+
[CmdletBinding()]
32+
Param(
33+
[string]$SQLInstance="localhost",
34+
[string]$myuser,
35+
[string]$mypass
36+
)
37+
38+
# Load Common Modules and .NET Assemblies
39+
try
40+
{
41+
Import-Module ".\SQLTranscriptase.psm1" -ErrorAction Stop
42+
}
43+
catch
44+
{
45+
Throw('SQLTranscriptase.psm1 not found')
46+
}
47+
48+
# Init
49+
Set-StrictMode -Version latest;
50+
[string]$BaseFolder = (Get-Item -Path ".\" -Verbose).FullName
51+
Write-Host -f Yellow -b Black "22 - Policy Based Mgmt Objects"
52+
Write-Output("Server: [{0}]" -f $SQLInstance)
53+
54+
# Server connection check
55+
$SQLCMD1 = "select serverproperty('productversion') as 'Version'"
56+
try
57+
{
58+
if ($mypass.Length -ge 1 -and $myuser.Length -ge 1)
59+
{
60+
Write-Output "Testing SQL Auth"
61+
$myver = ConnectSQLAuth -SQLInstance $SQLInstance -Database "master" -SQLExec $SQLCMD1 -User $myuser -Password $mypass -ErrorAction Stop| Select-Object -ExpandProperty Version
62+
$serverauth="sql"
63+
}
64+
else
65+
{
66+
Write-Output "Testing Windows Auth"
67+
$myver = ConnectWinAuth -SQLInstance $SQLInstance -Database "master" -SQLExec $SQLCMD1 -ErrorAction Stop | Select-Object -ExpandProperty Version
68+
$serverauth = "win"
69+
}
70+
71+
if($null -eq $myver)
72+
{
73+
Write-Output ("SQL Version: {0}" -f $myver)
74+
}
75+
76+
}
77+
catch
78+
{
79+
Write-Host -f red "$SQLInstance appears offline."
80+
Set-Location $BaseFolder
81+
exit
82+
}
83+
84+
# Get Conditions
85+
$SQLCMD1="SELECT * FROM [msdb].[dbo].[syspolicy_conditions] WHERE is_system=0"
86+
if ($serverauth -eq 'win')
87+
{
88+
$Conditions = Connect-InternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD1 -ErrorAction Stop
89+
}
90+
else {
91+
$Conditions = Connect-ExternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD1 -User $myuser -Password $mypass -ErrorAction Stop
92+
}
93+
94+
95+
# Get Policies
96+
$SQLCMD2="
97+
SELECT
98+
c.name AS 'condition_name',
99+
a.name AS 'policy_category',
100+
p.*
101+
FROM
102+
msdb.dbo.syspolicy_policies P
103+
LEFT JOIN
104+
dbo.syspolicy_conditions C
105+
ON
106+
c.condition_id = p.condition_id
107+
LEFT JOIN
108+
[syspolicy_policy_categories] A
109+
ON
110+
A.policy_category_id = P.policy_category_id
111+
WHERE
112+
c.is_system=0
113+
"
114+
115+
if ($serverauth -eq 'win')
116+
{
117+
$Policies = Connect-InternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD2 -ErrorAction Stop
118+
}
119+
else {
120+
$Policies = Connect-ExternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD2 -User $myuser -Password $mypass -ErrorAction Stop
121+
}
122+
123+
124+
# Prep Output Folders
125+
Write-Output "$SQLInstance - PBM"
126+
$Output_path = "$BaseFolder\$SQLInstance\22 - PBM\"
127+
if(!(test-path -path $Output_path))
128+
{
129+
mkdir $Output_path | Out-Null
130+
}
131+
132+
# Policies
133+
$POutput_path = "$BaseFolder\$SQLInstance\22 - PBM\Policies\"
134+
if(!(test-path -path $POutput_path))
135+
{
136+
mkdir $POutput_path | Out-Null
137+
}
138+
139+
# Conditions
140+
$COutput_path = "$BaseFolder\$SQLInstance\22 - PBM\Conditions\"
141+
if(!(test-path -path $COutput_path))
142+
{
143+
mkdir $COutput_path | Out-Null
144+
}
145+
146+
Write-Output "Writing Out..."
147+
148+
# Script Out
149+
if ($null -ne $Conditions)
150+
{
151+
Write-Output "Exporting PBM Conditions..."
152+
153+
foreach($Condition in $Conditions)
154+
{
155+
$myCName = $Condition.Name
156+
$myfixedName = $myCName.replace('\','_')
157+
$myfixedName = $myfixedName.replace('!','_')
158+
$myfixedName = $myfixedName.replace('/','_')
159+
$myfixedName = $myfixedName.replace('%','_')
160+
$Outfilename = $COutput_path+"$myfixedName.sql"
161+
"" | out-file -filepath $Outfilename -force -Encoding default
162+
163+
# Build SQL Statement
164+
"EXEC msdb.dbo.sp_syspolicy_add_condition" | Out-File -FilePath $Outfilename -Append -Encoding default
165+
" @name=N'"+$condition.name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
166+
" @description=N'"+$condition.description+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
167+
" @facet=N'"+$condition.facet+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
168+
" @expression=N'"+$condition.expression+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
169+
" @is_name_condition="+$condition.is_name_condition+"," | Out-File -FilePath $Outfilename -Append -Encoding default
170+
" @obj_name=N'"+$condition.is_name_condition+"'`r`n" | Out-File -FilePath $Outfilename -Append -Encoding default
171+
172+
173+
}
174+
}
175+
176+
if ($null -ne $Policies)
177+
{
178+
Write-Output "Exporting PBM Policies..."
179+
180+
foreach($Policy in $Policies)
181+
{
182+
$myPName = $Policy.Name
183+
$myfixedName = $myPName.replace('\','_')
184+
$myfixedName = $myfixedName.replace('!','_')
185+
$myfixedName = $myfixedName.replace('/','_')
186+
$myfixedName = $myfixedName.replace('%','_')
187+
$Outfilename = $POutput_path+"$myfixedName.sql"
188+
"" | out-file -filepath $Outfilename -force -Encoding default
189+
190+
# Build SQL Statement
191+
$Policy_id = $policy.policy_id
192+
193+
# sp_syspolicy_add_object_set
194+
$SQLCMD3 = 'SELECT * FROM [msdb].[dbo].[syspolicy_object_sets] WHERE object_set_id='+$Policy_ID
195+
if ($serverauth -eq 'win')
196+
{
197+
$Syspolicy_object_sets = Connect-InternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD3
198+
}
199+
else {
200+
$Syspolicy_object_sets = Connect-ExternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD3 -User $myuser -Password $mypass -ErrorAction Stop
201+
}
202+
if ($null -ne $Syspolicy_object_sets)
203+
{
204+
$object_set_name = $Syspolicy_object_sets.object_set_name
205+
$facet_name = $Syspolicy_object_sets.facet_name
206+
207+
"DECLARE @object_set_id INT;" | Out-File -FilePath $Outfilename -Append -Encoding default
208+
"EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name = N'"+$object_set_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
209+
" @facet = N'"+$facet_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
210+
" @object_set_id = @object_set_id OUTPUT;" | Out-File -FilePath $Outfilename -Append -Encoding default
211+
"SELECT @object_set_id;`r`n" | Out-File -FilePath $Outfilename -Append -Encoding default
212+
}
213+
214+
215+
# sp_syspolicy_add_target_set
216+
$SQLCMD4 = 'SELECT * FROM [msdb].[dbo].[syspolicy_target_sets] WHERE object_set_id='+$Policy_ID
217+
if ($serverauth -eq 'win')
218+
{
219+
$Syspolicy_target_sets = Connect-InternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD4
220+
}
221+
else {
222+
$Syspolicy_target_sets = Connect-ExternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD4 -User $myuser -Password $mypass -ErrorAction Stop
223+
}
224+
if ($null -ne $Syspolicy_target_sets)
225+
{
226+
$target_set_id = $Syspolicy_target_sets.target_set_id
227+
$target_type_skeleton = $Syspolicy_target_sets.type_skeleton
228+
$target_set_type = $Syspolicy_target_sets.type
229+
$target_set_enabled = $Syspolicy_target_sets.enabled
230+
231+
"DECLARE @target_set_id INT;" | Out-File -FilePath $Outfilename -Append -Encoding default
232+
"EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name = N'"+$object_set_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
233+
" @type_skeleton = N'"+$target_type_skeleton+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
234+
" @type = N'"+$target_set_type+"',"| Out-File -FilePath $Outfilename -Append -Encoding default
235+
" @enabled = "+$target_set_enabled+","| Out-File -FilePath $Outfilename -Append -Encoding default
236+
" @target_set_id = @target_set_id OUTPUT;"| Out-File -FilePath $Outfilename -Append -Encoding default
237+
"SELECT @target_set_id;`r`n"| Out-File -FilePath $Outfilename -Append -Encoding default
238+
}
239+
240+
241+
# sp_syspolicy_add_target_set_level
242+
$SQLCMD5 = 'SELECT * FROM [msdb].[dbo].[syspolicy_target_set_levels] WHERE target_set_id='+$target_set_id
243+
if ($serverauth -eq 'win')
244+
{
245+
$Syspolicy_target_set_levels = Connect-InternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD5
246+
}
247+
else {
248+
$Syspolicy_target_set_levels = Connect-ExternalSQLServer -SQLInstance $SQLInstance -Database 'msdb' -SQLExec $SQLCMD5 -User $myuser -Password $mypass -ErrorAction Stop
249+
}
250+
if ($null -ne $Syspolicy_target_set_levels)
251+
{
252+
$target_set_level_type_skeleton = $Syspolicy_target_set_levels.type_skeleton
253+
$target_set_level_level_name = $Syspolicy_target_set_levels.level_name
254+
$target_set_level_condition_id = $Syspolicy_target_set_levels.condition_id
255+
256+
"EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id = @target_set_id," | Out-File -FilePath $Outfilename -Append -Encoding default
257+
" @type_skeleton = N'"+$target_set_level_type_skeleton+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
258+
" @level_name = N'"+$target_set_level_level_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
259+
" @condition_name = N'"+$target_set_level_condition_id+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
260+
" @target_set_level_id = 0;`r`n" | Out-File -FilePath $Outfilename -Append -Encoding default
261+
262+
}
263+
264+
"GO`r`n" | Out-File -FilePath $Outfilename -Append -Encoding default
265+
266+
# sp_syspolicy_add_policy
267+
$policy_enabled = $policy.is_enabled
268+
269+
"DECLARE @policy_id INT;" | Out-File -FilePath $Outfilename -Append -Encoding default
270+
"EXEC msdb.dbo.sp_syspolicy_add_policy @name = N'"+$policy.Name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
271+
" @condition_name = N'"+$policy.condition_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
272+
" @policy_category = N'"+$policy.policy_category+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
273+
" @description = N'"+$policy.description+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
274+
" @help_text = N'"+$policy.help_text+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
275+
" @help_link = N'"+$policy.help_link+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
276+
" @schedule_uid = N'"+$policy.schedule_uid+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
277+
" @execution_mode = "+$policy.execution_mode+"," | Out-File -FilePath $Outfilename -Append -Encoding default
278+
" @is_enabled = "+$policy_enabled+"," | Out-File -FilePath $Outfilename -Append -Encoding default
279+
" @policy_id = @policy_id OUTPUT," | Out-File -FilePath $Outfilename -Append -Encoding default
280+
" @root_condition_name = N''," | Out-File -FilePath $Outfilename -Append -Encoding default
281+
" @object_set = N'"+$object_set_name+"'," | Out-File -FilePath $Outfilename -Append -Encoding default
282+
"SELECT @policy_id;" | Out-File -FilePath $Outfilename -Append -Encoding default
283+
"GO`r`n" | Out-File -FilePath $Outfilename -Append -Encoding default
284+
}
285+
}
286+
287+
# Return to Base
288+
set-location $BaseFolder

0 commit comments

Comments
 (0)