Advertisement
hdablin

WSUS approvals import and export script

Nov 24th, 2012
2,153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2.  .SYNOPSIS
  3.     Данный сценарий предназначен для упрощения задач администрирования Windows Server Update Services (WSUS)
  4. .Description
  5.     Сценарий позволяет импортировать и экспортировать одобрения обновлений WSUS, а также переносить одобрения с тестовых групп на "боевые".  
  6.     Сценарий имеет два режима работы: в режиме консольного приложения и в режиме графического приложения. По умолчанию (если не задан ни один параметр командной строки) сценарий запускается в графическом режиме. В иных случаях - в режиме командной строки
  7. .Parameter  DoImportFromFile
  8.     Путь к файлу, из которого нужно импортировать одобрения обновлений. Если этот параметр не задан (или указан несуществующий / некорректный) путь, импорт настроек не происходит.
  9. .Parameter  DoExportToFile
  10.     Путь к файлу выгрузки (экспорта) одобрений из WSUS. Если этот параметр не указан (или указан некорректный / пустой путь), экспорт одобрений в файл не выполняется.
  11. .Parameter  ServersCopyTestApprovals
  12.     Делать перенос одобрений с группы "gWSUS_Srv_test" на группу "gWSUS_Srv_prod"
  13. .Parameter  WorkstationsCopyTestApprovals
  14.     Делать перенос одобрений с группы "gWSUS_Wks_test" на группу "gWSUS_Wks_prod"
  15. .Parameter  PathToLog
  16.     Переназначает путь к лог-файлу. По-умолчанию, если не указан, лог пишется в TEMP-директорую, определённую системой.
  17. .EXAMPLE
  18.     .\wsus_admin_tool -DoImportFromFile c:\vms_updates.waf
  19.     Данная команда запустит импорт одобрений WSUS из файла c:\vms_updates.waf
  20. .EXAMPLE
  21.     .\wsus_admin_tool -DoExportToFile c:\2mpk\all\WSUS\today.waf
  22.     Данная команда запустит экспорт данных об одобрениях в файл c:\2mpk\all\WSUS\today.waf
  23. .EXAMPLE
  24.     .\wsus_admin_tool -DoImportFromFile c:\vms_updates.waf -ServersCopyTestApprovals
  25.     Данная команда запустит импорт одобрений WSUS из файла c:\vms_updates.waf, после чего одобрит все обновления, одобренные на группу gWSUS_Srv_Test, на группу gWSUS_Srv_Prod
  26. .EXAMPLE
  27.     .\wsus_admin_tool  -ServersCopyTestApprovals -WorkstationsCopyTestApprovals
  28.     Данная команда скопирует одобрения с группы gWSUS_Srv_Test на группу gWSUS_Srv_Prod, а с группы gWSUS_Wks_Test на группу gWSUS_Wks_Prod
  29. .LINK  
  30.     http://wiki.mp.local/Надеюсь_кто-нибудь_напишет_статью
  31. #>
  32.  
  33. param ([STRING]$DoImportFromFile="", [STRING]$DoExportToFile = "",
  34.         [System.Management.Automation.SwitchParameter]$ServersCopyTestApprovals=$false,
  35.         [System.Management.Automation.SwitchParameter]$WorkstationsCopyTestApprovals=$false,
  36.         [STRING]$PathToLog="")
  37.  
  38. $SCRIPT_VERSION_NUMBER  = "0.0041"
  39. $SCRIPT_NAME_STRING = "Скрипт для  WSUS v."
  40.  
  41. $STATUS_SCRIPT_ENDED = "Работа сценария завершена"
  42.  
  43.  
  44. $REGISTRY_HKCU_STORE_PATHES_KEY = "HKEY_CURRENT_USER\Software\PowershellWSUSAdminTool\"
  45. $REGISTRY_STORE_INPUT_FILE_VALUE = "InputFile"
  46. $REGISTRY_STORE_OUTPUT_FILE_VALUE = "OutPutDir"
  47.  
  48.  
  49. $FILESYSTEM_OBJECT_TYPE_FOLDER = "Folder"
  50. $FILESYSTEM_OBJECT_TYPE_FILE = "File"
  51.  
  52. $ERROR_THERE_IS_AN_ERROR = "Ошибка!"
  53.  
  54.  
  55. $SCRIPT_LOG_FILE_NAME = "WSUS_Admin_tool.log"
  56.  
  57.  
  58. $SCRIPT_RUN_MODE_GUI = "Graphic"
  59. $SCRIPT_RUN_MODE_CLI = "CommandLine"
  60.  
  61. $WSUS_GROUP_NAME_SERVERS_TEST   =   "gWSUS_srv_test"
  62. $WSUS_GROUP_NAME_SERVERS_PROD   =   "gWSUS_srv_prod"
  63. $WSUS_GROUP_NAME_WORKSTATIONS_TEST  =   "gWSUS_wks_test"
  64. $WSUS_GROUP_NAME_WORKSTATIONS_PROD  =   "gWSUS_wks_prod"
  65.  
  66. $WSUS_GROUPS_TO_EXPORT = ($WSUS_GROUP_NAME_WORKSTATIONS_TEST,$WSUS_GROUP_NAME_SERVERS_TEST)
  67.  
  68. $XML_TYPE_COMMENT   =   "Comment"
  69.  
  70. $DEFAULT_STATUS_BAR_TEXT = "Задайте нужные параметры и нажмите кнопку `"Выполнить`""
  71. $SYSTEM_DEFAULT_SHOW_PROGRESS_STEP = 10
  72. $SYSTEM_DEFAULT_SLEEP_TIME = 10
  73.  
  74. #Возвращает экземпляр объекта - сервера WSUS
  75. Function Get-WsusServerInstance()
  76. {  
  77.     $WSUSServer = $WSUS
  78.     #Получаем ссылку на текущий экземпляр сервера WSUS.
  79.     if ($WSUSServer -eq $null)
  80.     {
  81.         $WSUSServer =[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
  82.     }
  83.     Return $WSUSServer
  84. }
  85.  
  86. #Возвращает объект-группу WSUS по её имени.
  87. Function Get-WsusGroupByName([STRING]$Name)
  88. {  
  89.     $wsus = $null
  90.     $wsus = Get-WsusServerInstance
  91.     $Groups = $wsus.GetComputerTargetGroups()
  92.     Foreach ($Group in $Groups)
  93.     {
  94.         if ($Group.Name -eq $Name)
  95.         {
  96.             Return $Group
  97.         }
  98.     }
  99.     Return $null   
  100. }
  101.  
  102. #Возвращает массив обновлений, одобренных для заданной группы
  103. Function Get-UpdatesApprovedToGroup([STRING]$GroupName)
  104. {  
  105.    
  106.     $ApprovedUpdates = @()
  107.     $wsus = Get-WsusServerInstance
  108.     $Group = Get-WsusGroupByName -Name $GroupName
  109.    
  110.    
  111.     $UpdateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
  112.     #$UpdateScope.UpdateApprovalActions = `
  113.     #                                   [Microsoft.UpdateServices.Administration.UpdateApprovalActions]::Install #-bor `
  114.                                         #[Microsoft.UpdateServices.Administration.UpdateApprovalActions]::Uninstall
  115.     Change-StatusbarText -Text "Querying updates info from WSUS server..."                                     
  116.     $WsusUpdates = $wsus.GetUpdates()
  117.     $TotalWsusUpdates = $WsusUpdates.Count
  118.     $i = 0
  119.    
  120.     foreach ($Update in $WsusUpdates)
  121.     {
  122.         $i++
  123.         [STRING]$UpdateKB = $Update.KnowledgebaseArticles
  124.         Show-Progress -CurrentItem $i -Step $SYSTEM_DEFAULT_SHOW_PROGRESS_STEP -Template "Gathering approvals for update. Last porcessed is KB$UpdateKB" -TotalCount $TotalWsusUpdates
  125.        
  126.         #Проверяем, было ли одобрено текущее обновление на нужную нам группу  
  127.         $CurrentApprovals = $update.GetUpdateApprovals($group) 
  128.        
  129.         if ($CurrentApprovals.Count -gt 0)
  130.             {
  131.                
  132.                 #$Added = $false
  133.                 foreach ($Approval in $CurrentApprovals)
  134.                 {
  135.                     #if (($Approval.Action -ne  [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::NotApproved )`
  136.                     #       -and ($Added -eq $false))
  137.                     #{
  138.                    
  139.                     #Создаем объект, инкапсулирующий свойства обновления и его подтверждения.                   
  140.                     $Record = New-Object Object                        
  141.                     Add-Member -InputObject $Record -MemberType NoteProperty -Value $Update -Name "objUpdate" | Out-Null                       
  142.                     Add-Member -InputObject $Record -MemberType NoteProperty -Value $Approval -Name "objApproval" | Out-Null
  143.                    
  144.                     $ApprovedUpdates = $ApprovedUpdates + $Record  
  145.                     #   $Added = $true
  146.                     #}
  147.                 }
  148.                
  149.                
  150.             }
  151.     }
  152.    
  153.     Return $ApprovedUpdates
  154. }
  155.  
  156. #Экспортирует одобрения (для заданных групп) обновлений в файлы.
  157.  
  158. #Тут можно было бы обойтись Export-Clixml, но, во первых, это увеличит размер файла
  159. #экспорта во много раз, во-вторых, не позволит гибко управлять структурой XML-я.
  160. Function Export-Approvals ([STRING]$FilePath,[ARRAY]$ApprovedGroupsNames)
  161. {
  162.     $XML = New-Object XML
  163.    
  164.     $XMLGroupsNode = $XML.CreateElement("Groups")
  165.     $XML.AppendChild($XMLGroupsNode) | Out-Null
  166.        
  167.     Foreach ($Group in $ApprovedGroupsNames)
  168.     {
  169.         Change-StatusbarText -Text "Getting updates info for WSUS group: $Group"   
  170.                
  171.         $XMLCurrentGroupNode = $XML.CreateElement("$Group")    
  172.         $XML.SelectSingleNode("//Groups").AppendChild($XMLCurrentGroupNode)
  173.        
  174.        
  175.         #Получаем обновления, одобренные для данной группы
  176.         $ApprovedUpdates = $null
  177.         $ApprovedUpdates = Get-UpdatesApprovedToGroup -GroupName $Group
  178.        
  179.         if ($ApprovedUpdates -ne $null)
  180.         {
  181.             $TotalUpdates = $ApprovedUpdates.Count
  182.             $i = 0
  183.             #Правим результирующую XML-ку
  184.             Foreach ($Update in $ApprovedUpdates)
  185.             {
  186.                 $i++
  187.                 [STRING]$UpdateKB = $Update.objUpdate.KnowledgebaseArticles
  188.                 #Write-Status -Message $("Exporting update $i of $TotalUpdates" + ": KB$UpdateKB")
  189.                 Show-Progress -CurrentItem $i -Template "Exporting updates approvals. Last processed is KB$UpdateKB" -Step 10 -TotalCount $TotalUpdates
  190.                
  191.                 #Создаем XML-элемент для текущего обновления внутри текущей группы           
  192.                 $XMLUpdateNode = $XML.CreateElement("Update")
  193.                 #$XML.SelectSingleNode("//Groups/$Group").AppendChild($XMLUpdateNode)
  194.            
  195.                 #Добавляем к узлу обновления реальные свойства обновления
  196.    
  197.                 #Продукт, для которого предназначено обновление
  198.                 $XMLUpdateProduct = $XML.CreateElement("UpdateProduct")
  199.                 $XMLUpdateProduct.InnerText = $Update.objUpdate.ProductTitles          
  200.                 $XMLUpdateNode.AppendChild($XMLUpdateProduct)
  201.            
  202.                 #Номер KB
  203.                 $XMLUpdateKB = $XML.CreateElement("UpdateKB")
  204.                 $XMLUpdateKB.InnerText = $UpdateKB         
  205.                 $XMLUpdateNode.AppendChild($XMLUpdateKB)
  206.                        
  207.                 #Описание обновления
  208.                 $XMLUpdateDescription = $XML.CreateElement("UpdateDescription")
  209.                 $XMLUpdateDescription.InnerText = $Update.objUpdate.Description        
  210.                 $XMLUpdateNode.AppendChild($XMLUpdateDescription)
  211.            
  212.                 #ID обновления
  213.                 $XMLUpadteID = $XML.CreateElement("UpdateID")
  214.                 $XMLUpadteID.InnerText = $Update.objUpdate.Id.UpdateId         
  215.                 $XMLUpdateNode.AppendChild($XMLUpadteID)
  216.            
  217.                 #Признак отмененного обновления
  218.                 $XMLUpdateIsDeclined = $XML.CreateElement("UpdateIsDeclined")
  219.                 $XMLUpdateIsDeclined.InnerText = $Update.objUpdate.IsDeclined          
  220.                 $XMLUpdateNode.AppendChild($XMLUpdateIsDeclined)
  221.            
  222.                 #Признак необязательного обновления
  223.                 $XMLUpdateApprovalIsOptional = $XML.CreateElement("UpdateApprovalIsOptional")
  224.                 $XMLUpdateApprovalIsOptional.InnerText = $Update.objApproval.IsOptional        
  225.                 $XMLUpdateNode.AppendChild($XMLUpdateApprovalIsOptional)
  226.            
  227.                 #Дедлайн обновления
  228.                 $XMLUpdateApprovalDeadLine = $XML.CreateElement("UpdateApprovalDeadLine")
  229.                 $XMLUpdateApprovalDeadLine.InnerText = $Update.objApproval.DeadLine    
  230.                 $XMLUpdateNode.AppendChild($XMLUpdateApprovalDeadLine)
  231.            
  232.                 #Действие, заданное для данного обновления
  233.                 $XMLUpdateApprovalAction = $XML.CreateElement("UpdateApprovalAction")
  234.                 $XMLUpdateApprovalAction.InnerText = $Update.objApproval.Action    
  235.                 $XMLUpdateNode.AppendChild($XMLUpdateApprovalAction)
  236.            
  237.                 $XML.SelectSingleNode("//Groups/$Group").AppendChild($XMLUpdateNode)
  238.             }
  239.         }
  240.         Write-Status -Message "Export finished for group: $Group"  
  241.         Change-StatusbarText -Text "Export finished for group: $Group"
  242.     }
  243.    
  244.     Write-Status -Message "Saving export file..."  
  245.     Change-StatusbarText -Text "Saving export file..."
  246.     $XML.Save($FilePath) | Out-Null
  247.     Write-Status -Message "Export file saved."
  248.     Change-StatusbarText -Text  "Export file saved."
  249. }
  250.  
  251. #
  252. #Принимает путь к XML-Документу, возращает объект, представляющий этот XML-файл
  253. Function Get-XmlFile([String]$FilePath)
  254. {
  255.     If ((Test-Path $FilePath) -and ($FilePath -ne ""))
  256.     {
  257.         $xml = [xml](get-content $FilePath)
  258.         trap
  259.         {    
  260.             Throw "Invalid XML file. Check your configuration and spelling."
  261.         }
  262.     }
  263.     else
  264.     {
  265.         Throw "XML-File was not found."
  266.        
  267.     }    
  268.     Return $xml
  269. }
  270.  
  271. #Возвращает значение узла XML
  272. #Написана для того, чтобы корректно ловить исключения именно в этой функции.
  273. Function Get-XmlValue ($XML)
  274. {
  275.     $Res = $xml
  276.     if ($Res -eq $null)
  277.     {
  278.         throw "Invalid XML: there is no needed attribute"
  279.     } else
  280.     {
  281.         return $Res
  282.     }    
  283. }
  284.  
  285. #Проверяет валидность XML-файла на основе схемы XSD.
  286. #Принимает пути к XML и XSD, возвращает $true, если
  287. #файл валидный и false иначе.
  288. Function Validate-Xml([STRING]$XMLpath, [STRING]$XmlSchema)
  289. {
  290.     if ((Test-Path $XmlSchema) -and (Test-Path $XMLpath))
  291.     {
  292.         $readerSettings = New-Object -TypeName System.Xml.XmlReaderSettings
  293.         $readerSettings.ValidationType = [System.Xml.ValidationType]::Schema
  294.         $readerSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessInlineSchema -bor     [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation -bor     [System.Xml.Schema.XmlSchemaValidationFlags]::ReportValidationWarnings
  295.         $res = $readerSettings.Schemas.Add($Namespace, $XmlSchema)
  296.         $readerSettings.add_ValidationEventHandler(
  297.             {
  298.                 $failureMessages = $failureMessages + [System.Environment]::NewLine + $XMLpath + " - " + $_.Message
  299.                 $failCount = $failCount + 1
  300.             });
  301.            $reader = [System.Xml.XmlReader]::Create($XMLpath, $readerSettings)
  302.            while ($reader.Read())
  303.         {
  304.            
  305.         }            
  306.         if ($failCount -eq $null)
  307.         {        
  308.             $res = $true
  309.         }
  310.         else
  311.         {
  312.             Write-Status -Message  "Ошибка в конфигурационном файле скрипта."
  313.             Write-Status -Message $failureMessages
  314.             $res = $false
  315.         }
  316.     }    
  317.     else
  318.     {
  319.         $res = $false
  320.     }
  321.     return $Res
  322. }
  323.  
  324. #Импортирует одобрения обновлений из файла
  325. Function Import-Approvals([STRING]$FilePath)
  326. {
  327.     Start-WSUSSync | Out-Null  
  328.     $WSUS = Get-WsusServerInstance
  329.     $XML = Get-XmlFile -FilePath $FilePath
  330.     $Groups = Get-XmlValue $XML.Groups
  331.     $Groups = $Groups.ChildNodes
  332.    
  333.     Foreach ($Group in $Groups)
  334.     {      
  335.         if ($Group.get_NodeType() -ne $XML_TYPE_COMMENT)
  336.         {
  337.             $GroupName = Get-XMLValue -XML $Group.Name
  338.             Write-Status -Message "Importing updates for WSUS group: $GroupName"   
  339.             Change-StatusbarText -Text "Importing updates for WSUS group: $GroupName"
  340.             $objGroup = Get-WsusGroupByName -Name $GroupName
  341.             $Updates = $Group.ChildNodes
  342.             $TotalUpdates = $Updates.Count
  343.             $i = 0         
  344.             Foreach ($Update in $Updates)
  345.             {
  346.                 $i++
  347.                 $UpdateGUID = Get-XmlValue -XML $Update.UpdateID
  348.                 if ($UpdateGUID -ne "")
  349.                 {
  350.                    
  351.                     $UpdateKB = $Update.UpdateKB
  352.                     Show-Progress -CurrentItem $i -Step $SYSTEM_DEFAULT_SHOW_PROGRESS_STEP -TotalCount $TotalUpdates -Template "Importing updates for $GroupName. Last processed is KB$UpdateKB"
  353.                     #Write-Status -Message $("Importing update $i of $TotalUpdates" + ": KB$UpdateKB")
  354.                     #Находим Update с таким ID на сервере:
  355.                     $UpdateGUID = [System.Guid]$UpdateGUID
  356.                     $objUpdateID = [Microsoft.UpdateServices.Administration.UpdateRevisionId]$UpdateGUID
  357.                     $objUpdate = $WSUS.GetUpdate($objUpdateID)
  358.                    
  359.                     #Получаем свойства обновления и его одобрения из XML-ки, преобразовываем все это к нужным типам                
  360.                     [DateTime]$UpdateApprovalDeadline   = Get-XmlValue -XML $Update.UpdateApprovalDeadLine
  361.                     [Microsoft.UpdateServices.Administration.UpdateApprovalAction]$UpdateApprovalAction = Get-XmlValue -XML $Update.UpdateApprovalAction
  362.                     if ($Update.UpdateIsDeclined -eq "true")
  363.                     {
  364.                         $UpdateIsDeclined = $true  
  365.                     } else
  366.                     {
  367.                         $UpdateIsDeclined = $false 
  368.                     }
  369.                    
  370.                    
  371.                     #Подтверждаем обновление
  372.                     $objUpdate.Approve($UpdateApprovalAction,$objGroup,$UpdateApprovalDeadline) | Out-Null
  373.                     #Ставим статус "Отменен"
  374.                     $objUpdate.IsDeclined = $UpdateIsDeclined                  
  375.                 }
  376.             }
  377.         }
  378.         Write-Status -Message "Import finished for group: $GroupName"  
  379.         Change-StatusbarText -Text "Import finished for group: $GroupName" 
  380.     }
  381. }
  382.  
  383. Function Copy-Approvals([STRING]$SourceGroupName,[STRING]$DestGroupName)
  384. {
  385.     Start-WSUSSync | Out-Null
  386.     Write-Status -Message "Started copying approvals from $SourceGroupName to $DestGroupName"
  387.     Change-StatusbarText -Text "Started copying approvals from $SourceGroupName to $DestGroupName"
  388.     $objSourceGroup = Get-WsusGroupByName -Name $SourceGroupName
  389.     $objDestGroup = Get-WsusGroupByName -Name $DestGroupName
  390.     $wsus = Get-WsusServerInstance
  391.    
  392.     $ApprovedUpdates = Get-UpdatesApprovedToGroup -GroupName $SourceGroupName
  393.     #$Updates = $wsus.GetUpdates()
  394.     $TotalCount = $ApprovedUpdates.Count
  395.     $i = 0
  396.     if ($ApprovedUpdates -ne $null)
  397.     {
  398.         foreach ($Update in $ApprovedUpdates)      
  399.         {
  400.             $i++   
  401.             $UpdateKB = $Update.objUpdate.KnowledgebaseArticles
  402.             Show-Progress -CurrentItem $i -Step $SYSTEM_DEFAULT_SHOW_PROGRESS_STEP -TotalCount $TotalCount -Template "Copying approvals from $SourceGroupName to $DestGroupName. Last processed is $UpdateKB"
  403.             #Write-Status -Message $("Copying update $i of $TotalCount" + ": KB$UpdateKB")
  404.             $UpdateApprovalDeadline = $Update.objApproval.Deadline
  405.             $UpdateApprovalAction = $Update.objApproval.Action
  406.             $Update.objUpdate.Approve($UpdateApprovalAction,$objDestGroup,$UpdateApprovalDeadline) | Out-Null
  407.         }
  408.     }
  409.     Write-Status -Message "Finished copying approvals from $SourceGroupName to $DestGroupName"
  410.     Change-StatusbarText -Text "Finished copying approvals from $SourceGroupName to $DestGroupName"
  411. }
  412.  
  413.  
  414. function Show-Progress([STRING]$Template,[LONG]$TotalCount,[LONG]$CurrentItem,[BYTE]$Step)
  415. {
  416.     $Delta = [Math]::Round($Step * $TotalCount / 100)
  417.    
  418.     $M = $CurrentItem % $Delta
  419.     $Message = $Template + " ($CurrentItem of $TotalCount)"
  420.    
  421.     Write-Status -Message $Message
  422.    
  423.    
  424.     if (($CurrentItem -eq 1) -or ($M -eq 0) -or ($CurrentItem -eq $TotalCount))
  425.         {
  426.             Change-StatusbarText -Text $Message        
  427.         }      
  428. }      
  429.  
  430. Function Change-StatusbarText([STRING]$Text)
  431. {
  432.         $StatusBar.Text = $Text
  433.         $MainForm.Refresh() | Out-Null
  434. }
  435.  
  436.  
  437. #Функция вывода данных о происходящем: пишет в статусную строку, лог, консоль, STDOut, еще куда-то: в зависимости от
  438. #режима запуска и других условий
  439. Function Write-Status([STRING]$Message)
  440. {
  441.  
  442.     if ($Message -ne " ")
  443.     {
  444.             [String]$DT = $(Get-Date)
  445.             [String]$Str = $($DT + " " + $Message)
  446.     }else
  447.     {
  448.             $Str = " "
  449.     }
  450.     if ($Script:RunMode -eq $SCRIPT_RUN_MODE_CLI)
  451.     {
  452.         Write-Host $Str
  453.     }  
  454.        
  455.     If (($Script:gLogFile -ne "") -and ($Script:gLogFile -ne $null))
  456.     {
  457.         # echo $Message + "`n" >> $Script:gLogFile -
  458.         Write-Output $Str | Out-File -FilePath $Script:gLogFile -Append
  459.     }
  460.        
  461.  
  462.  
  463.  
  464. #   if ($Script:RunMode -eq $SCRIPT_RUN_MODE_CLI)
  465. #   {
  466. #  
  467. #   }
  468. #   elseif ($Script:RunMode -eq $SCRIPT_RUN_MODE_GUI)
  469. #   {
  470. #       Change-StatusbarText -Text $Message
  471. #   }
  472. }
  473.  
  474.  
  475. Function Create-Directory ([STRING]$PATH)
  476. {
  477.     $ErrorActionPreference = "SilentlyContinue"
  478.     New-Item -type directory -path $PATH -ea 0
  479.     trap
  480.         {
  481.             Write-Status -Message $_
  482.             continue
  483.         }
  484. }
  485.  
  486. Function Change-StatusbarText([STRING]$Text)
  487. {
  488.         $StatusBar.Text = $Text
  489.         $MainForm.Refresh() | Out-Null
  490. }
  491.  
  492.  
  493.  
  494. Function Get-RegValue([STRING]$Param,$DefaultValue)
  495. {
  496.     $ErrorActionPreference = "silentlycontinue"
  497.     $Value = $null
  498.     $Value = (get-itemproperty "registry::$REGISTRY_HKCU_STORE_PATHES_KEY")."$Param"
  499.     trap {continue}
  500.    
  501.     If ($Value -eq $null)
  502.     {
  503.         $Value = $DefaultValue     
  504.     }
  505.     Return $Value  
  506. }
  507.  
  508. #Сохраняет знаяение выбора в реестре
  509. Function Set-RegValue ([STRING]$Value, [STRING]$Param)
  510. {  
  511.     $ErrorActionPreference = "SilentlyContinue"
  512.     Trap {continue}
  513.     New-Item -Path "registry::$REGISTRY_HKCU_STORE_PATHES_KEY" -ItemType "Directory"
  514.     Set-ItemProperty -Force -Path "registry::$REGISTRY_HKCU_STORE_PATHES_KEY" -name "$Param" -Value $Value
  515.    
  516. }
  517.  
  518. #Определяет (неточно), является ли переданная строка путем к папке или файлу
  519. Function Get-TypeOfFSObject([STRING]$Path)
  520. {
  521.     $ErrorActionPreference = "silentlycontinue"
  522.     $File = $FILESYSTEM_OBJECT_TYPE_FILE
  523.     $Folder = $FILESYSTEM_OBJECT_TYPE_FOLDER
  524.     $Res = $null   
  525.     $FSObject = $null  
  526.     $FSObject = Get-Item $Path  | Out-Null
  527.     #Если объект таки есть в системе, значит его тип можно узнать точно
  528.     if ($FSObject -ne $null)
  529.     {
  530.         #Смотрим, является ли элемент каталогом
  531.         if ($FSObject.Attributes -eq "Directory")
  532.         {
  533.             Return $Folder         
  534.         }
  535.         else #Элемент - не каталог, значит, - он - файл
  536.         {
  537.             Return $File
  538.         }      
  539.     }
  540.     else #Если объект не существует, будем пытаться распарсить строку
  541.     {
  542.         #Несуществующий путь, оканчивающийся на "\" - скорее всего, папка
  543.         if ($Path -match "^.*\\$")
  544.         {
  545.             Return $Folder         
  546.         }
  547.        
  548.         #Несуществующий элемнт, имеющий точку в последней части пути - скорее всего,
  549.         #файл
  550.         $Leaf = Split-Path -Leaf $Path
  551.         if ($Leaf -match "^.*\..*$")
  552.         {
  553.             Return $File
  554.         } else #Если точки нет, то в Винде это, скорее всего, все таки папка
  555.         {
  556.             Return $Folder
  557.         }
  558.     }
  559.    
  560.     Trap {continue}
  561. }
  562.  
  563.  
  564. #Отрисовывает диалог выбора файла. Возвращает путь, выбранный пользователем  
  565. function Open-FIleDialog([STRING]$InitialPath,[String]$DialogType)
  566. {
  567.     if ($DialogType -eq "System.Windows.Forms.OpenFileDialog")
  568.     {
  569.         $OpenFileForm = New-Object System.Windows.Forms.OpenFileDialog         
  570.     }
  571.     elseif ([STRING]$InitialPath,[TYPE]$DialogType)
  572.     {
  573.         $OpenFileForm = New-Object System.Windows.Forms.SaveFileDialog         
  574.     }
  575.     $OpenFileForm.InitialDirectory = [STRING]$InitialPath
  576.     $OpenFileForm.Filter = "WSUS admin tool files(*.waf)|*.waf|All files (*.*)|*.*"
  577.     $Show = $OpenFileForm.ShowDialog()
  578.     If ($Show -eq "OK")
  579.     {
  580.        
  581.         Return $OpenFileForm.FileName
  582.     }
  583.     Else
  584.     {
  585.         #Write-Error "Operation cancelled by user."
  586.     }
  587. }
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594. #Основная функция, запускаемая по кнопке "Выполнить"
  595. Function Start-Run()
  596. {
  597.     Change-StatusbarText -Text "Saving current settings..."
  598.     Save-Settings | Out-Null   
  599.     Start-WSUSActions | Out-Null
  600.     Change-StatusbarText -Text  "Задайте нужные параметры и нажмите кнопку `"Выполнить`""
  601.     $Res = &($Script:gLogFile)
  602. }
  603.  
  604. Function Form-Close()
  605. {
  606.     $MainForm.Close()
  607.     Save-Settings | Out-Null
  608. }
  609.  
  610. #Показывает пользователюю сообщение
  611. Function Show-Message([STRING]$Title,[STRING]$Text,[Windows.Forms.MessageBoxButtons]$Buttons,[Windows.Forms.MessageBoxIcon]$Icon)
  612. {
  613.     [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  614.     [Windows.Forms.MessageBox]::Show($Text, $Title, $Buttons, $Icon)
  615. }
  616.  
  617. #Проверяет, все ли данные заполены корректно
  618. function Check-EnteredData()
  619. {
  620.  
  621. }
  622.  
  623. function Remove-File([STRING]$File)
  624. {
  625.     $ErrorActionPreference = "SilentlyContinue"
  626.     Remove-Item $File -Force | Out-Null
  627.     trap
  628.     {
  629.         continue
  630.     }
  631. }
  632.  
  633. #Сохраняет значения параметров приложеня в реестр
  634. Function Save-Settings()
  635. {
  636.     $Controls = $MainForm.Controls
  637.     Foreach ($Control in $Controls)
  638.     {
  639.         #Если это чекбокс, сохраним его состояние
  640.         if ($Control.GetType() -eq [System.Windows.Forms.CheckBox])
  641.         {
  642.             $Res =  Set-RegValue -Value $Control.Checked -Param $Control.Name  
  643.         }
  644.         #Если это поле ввода, сохраним его текст
  645.         elseif ($Control.GetType() -eq [System.Windows.Forms.TextBox])
  646.         {
  647.             $Res =  Set-RegValue -Value $Control.Text -Param $Control.Name 
  648.         }  
  649.        
  650.     }      
  651. }
  652.  
  653. #Загружает значения основных параметров из реестра
  654. Function Load-Settings()
  655. {
  656.  
  657.     $ErrorActionPreference = "silentlycontinue"
  658.     $Values = get-itemproperty "registry::$REGISTRY_HKCU_STORE_PATHES_KEY"
  659.     $Controls = $MainForm.Controls
  660.     Foreach ($Control in $Controls)
  661.     {
  662.         #Если это чекбокс, считываем значение его состояния
  663.         if ($Control.GetType() -eq [System.Windows.Forms.CheckBox])
  664.         {
  665.             $STRChecked = Get-RegValue -Param $Control.Name -DefaultValue "false"
  666.             if ($STRChecked -eq "true")
  667.             {
  668.                 $CHK = $true
  669.             }
  670.             else
  671.             {
  672.                 $CHK = $false
  673.             }
  674.            
  675.             $Control.Checked = $CHK  
  676.         }  
  677.         #Если это поле ввода, считываем сохраненный текст
  678.         elseif ($Control.GetType() -eq [System.Windows.Forms.TextBox])
  679.         {
  680.             $Control.Text =  Get-RegValue -Param $Control.Name -DefaultValue $DEFAULT_USER_PATH
  681.         }
  682.        
  683.        
  684.     }
  685.    
  686. }
  687.  
  688. #Обработчик переключения чекбокса для $DoApprovalImportCheckBox
  689. Function DoApprovalImportCheckBox_OnClick()
  690. {
  691.     If ($DoApprovalImportCheckBox.Checked -eq $false)
  692.         {
  693.             $TextBoxInputFile.Enabled = $false
  694.             $BrowseButtonInputFile.Enabled = $false
  695.         } else
  696.         {
  697.             $TextBoxInputFile.Enabled = $true
  698.             $BrowseButtonInputFile.Enabled = $true
  699.                                    
  700.         }
  701. }
  702.  
  703. #Обработчик переключения чекбокса для $DoApprovalImportCheckBox
  704. Function DoApprovalExportCheckBox_OnClick()
  705. {
  706.     If ($DoApprovalExportCheckBox.Checked -eq $false)
  707.         {
  708.             $TextBoxOutputFIle.Enabled = $false
  709.             $BrowseButtonOutputFIle.Enabled = $false
  710.         } else
  711.         {
  712.             $TextBoxOutputFIle.Enabled = $true
  713.             $BrowseButtonOutputFIle.Enabled = $true
  714.                                    
  715.         }
  716. }
  717.  
  718. #Запускает на исполнения действия над базой WSUS (с учетом режима запуска, настроек и т.д.)
  719. function Start-WSUSActions()
  720. {
  721.     Change-StatusbarText -Text "Start executing WSUS actions..."
  722.    
  723.     #Если мы в графическом режиме, берем настройки прямо с формы
  724.     if ($Script:RunMode -eq $SCRIPT_RUN_MODE_GUI)
  725.     {
  726.         $DoCopyServerApprovals =  $DoCopyApprovalsForServers.Checked
  727.         $DoCopyWKSApprovals = $DoCopyApprovalsForWorkStations.Checked
  728.        
  729.         $DoExportApprovals = $DoApprovalExportCheckBox.Checked
  730.         $DoImportApprovals = $DoApprovalImportCheckBox.Checked
  731.        
  732.         $IputFileName = $TextBoxInputFile.Text
  733.         $OutputFileName = $TextBoxOutputFIle.Text  
  734.        
  735.     }
  736.     #Если мы в текстовом режиме - берем настройки из параметров скрипта
  737.     elseif ($Script:RunMode -eq $SCRIPT_RUN_MODE_CLI)
  738.     {
  739.         $DoCopyServerApprovals = $ServersCopyTestApprovals
  740.         $DoCopyWKSApprovals = $WorkstationsCopyTestApprovals
  741.        
  742.         #Если параметр $DoExportToFile - пустой, значит экспорт не делаем
  743.         if ($DoExportToFile -eq "")
  744.         {
  745.             $DoExportApprovals = $false
  746.         } else
  747.         {
  748.             $DoExportApprovals = $true
  749.         }
  750.        
  751.         #Если параметр $DoImportFromFile - пустой, импорт не делаем
  752.         if ($DoImportFromFile -eq "")
  753.         {
  754.             $DoImportApprovals = $false
  755.         }else
  756.         {
  757.             $DoImportApprovals = $true
  758.         }      
  759.        
  760.         $IputFileName = $DoImportFromFile
  761.         $OutputFileName = $DoExportToFile
  762.     }
  763.    
  764.     #Параметры определены, начинаем выполнение
  765.    
  766.     #Подтверждение "тестовых" разрешений на рабочие станции
  767.     if ($DoCopyWKSApprovals -eq $true)
  768.     {
  769.         Copy-Approvals -SourceGroupName $WSUS_GROUP_NAME_WORKSTATIONS_TEST -DestGroupName $WSUS_GROUP_NAME_WORKSTATIONS_PROD | Out-Null
  770.     }
  771.    
  772.     #Подтверждение "тестовых" разрешений на серверы
  773.     if ($DoCopyServerApprovals -eq $true)
  774.     {
  775.         Copy-Approvals -SourceGroupName $WSUS_GROUP_NAME_SERVERS_TEST -DestGroupName $WSUS_GROUP_NAME_SERVERS_PROD | Out-Null
  776.     }
  777.    
  778.     #Экспорт подтверждений в файл
  779.     if ($DoExportApprovals -eq $true)
  780.     {
  781.         Export-Approvals -FilePath $OutputFileName -ApprovedGroupsNames $WSUS_GROUPS_TO_EXPORT | Out-Null
  782.     }  
  783.    
  784.     #Импорт подтверждений из файла
  785.     if ($DoImportApprovals -eq $true)
  786.     {
  787.         Import-Approvals -FilePath $IputFileName | Out-Null
  788.     }  
  789. }
  790.  
  791. Function Start-WSUSSync()
  792. {
  793.     Write-Status -Message "Starting WSUS Synchronization..."
  794.     Change-StatusbarText -Text "Starting WSUS Synchronization..."
  795.    
  796.     $Res = $false
  797.     $wsus = Get-WsusServerInstance
  798.     $WSUSSubscription = $wsus.GetSubscription()
  799. #   $PrevTime = $WSUSSubscription.GetLastSynchronizationInfo().EndTime
  800.    
  801.     $Sync = $WSUSSubscription.StartSynchronization()
  802.    
  803.    
  804.    
  805.     #Ждем, пока выполнится синхронизация
  806.     $Try = 0
  807.     while ($WSUSSubscription.GetSynchronizationStatus() -eq [Microsoft.UpdateServices.Administration.SynchronizationStatus]::Running)
  808.     {
  809.         $Try++
  810.         Change-StatusbarText -Text "Waiting WSUS Synchronization: try $Try"
  811.         Start-Sleep -Seconds $SYSTEM_DEFAULT_SLEEP_TIME
  812.        
  813.     }
  814.    
  815.    
  816.     if ($WSUSSubscription.GetLastSynchronizationInfo().Result -eq [Microsoft.UpdateServices.Administration.SynchronizationResult]::Succeeded)
  817.     {  
  818.         $Res = $true
  819.         Write-Status -Message "Starting WSUS succeeded"
  820.         Change-StatusbarText -Text "Starting WSUS succeeded"
  821.     }  
  822.     else
  823.     {
  824.         Write-Status -Message "Starting WSUS Synchronization failed"
  825.         Change-StatusbarText -Text "Starting WSUS Synchronization failed"
  826.     }
  827.    
  828.     Return $Res
  829.    
  830.    
  831.    
  832. }
  833.  
  834.  
  835. cls
  836. #$res = Start-WSUSSync
  837.  
  838. $wsus=$null
  839.  
  840.  
  841.  
  842. $Script:gLogLevel = 5
  843. if (-not (($PathToLog -ne "") -and (Test-Path $PathToLog -PathType Any -IsValid))) {
  844.     $PathToLog = [System.IO.Path]::GetTempPath()
  845. }
  846. $Script:gLogFile = Join-Path $PathToLog $SCRIPT_LOG_FILE_NAME
  847. Remove-File -File $Script:gLogFile | Out-Null
  848. echo "" > $Script:gLogFile
  849.  
  850. #Загружаем библиотеку управления WSUS.
  851. [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")|out-null
  852. [reflection.assembly]::LoadWithPartialName("System.Management.Automation")|out-null
  853.  
  854.  
  855. #Определяем значение путей по умолчанию. В качестве такого пути будем использовать
  856. #домашний диск пользователя
  857.  
  858.  
  859. $DEFAULT_USER_PATH = $ENV:TEMP
  860. $DEFAULT_USER_PATH = Join-Path $DEFAULT_USER_PATH "\"
  861.  
  862.  
  863. #Определяем режим запуска сценария. Если все параемтры - "умолчальные", значит - графический
  864. If (($DoImportFromFile -eq "") -and ($DoExportToFile -eq "") `
  865.         -and ($ServersCopyTestApprovals -eq $false) `
  866.         -and ($WorkstationsCopyTestApprovals -eq $false))
  867. {
  868.     $Script:RunMode = $SCRIPT_RUN_MODE_GUI
  869. } else
  870. {
  871.     $Script:RunMode = $SCRIPT_RUN_MODE_CLI
  872. }
  873.  
  874.  
  875. #Если режим запуска - графический, рисуем GUI, иначе - сразу запускаем выполнение
  876.  
  877. if ($Script:RunMode -eq $SCRIPT_RUN_MODE_GUI)
  878. {
  879.     #----------------<GUI>----------------------------------------------------------
  880.     #Подгружаем библиотеки.
  881.     [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
  882.     [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  883.  
  884.     #Создаем форму, на которой все будет отрисовываться
  885.     $MainForm = New-Object System.Windows.Forms.Form
  886.     $MainForm.Name = "MainForm"
  887.     $MainForm.Text = $SCRIPT_NAME_STRING + $SCRIPT_VERSION_NUMBER
  888.     $MainForm.Size = New-Object System.Drawing.Size(790,282)
  889.     #$MainForm.MinimumSize = New-Object System.Drawing.Size(790,282)  
  890.     #$MainForm.MaximumSize = New-Object System.Drawing.Size(1054,282)
  891.     $MainForm.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle
  892.     $MainForm.StartPosition = "CenterScreen"
  893.     $MainForm.MaximizeBox = $false
  894.  
  895.  
  896.     $MainForm.KeyPreview = $True
  897.  
  898.  
  899.  
  900.  
  901.     #Прописываем основные клавиши формы
  902.     $MainForm.Add_KeyDown(
  903.             {
  904.             if ($_.KeyCode -eq "Enter")
  905.                 {
  906.                     $temp = Start-Run      
  907.                 }
  908.             })
  909.     $MainForm.Add_KeyDown(
  910.         {
  911.         if ($_.KeyCode -eq "Escape")
  912.             {
  913.                 $MainForm.Close()
  914.             }
  915.         })
  916.    
  917.     #Обработчик закрытия формы
  918.     $MainForm.add_Closing(
  919.         {
  920.             Save-Settings | Out-Null
  921.         }  
  922.     )  
  923.     #------Элементы формы
  924.  
  925.     #Чекбокс "Выполнить операцию импорта"
  926.     $DoApprovalImportCheckBox = New-Object System.Windows.Forms.CheckBox
  927.     $DoApprovalImportCheckBox.Name = "DoApprovalImportCheckBox"
  928.     $DoApprovalImportCheckBox.Location = New-Object System.Drawing.Size(8,14)
  929.     $DoApprovalImportCheckBox.size = new-object System.Drawing.Size(400,20)  
  930.     $DoApprovalImportCheckBox.Text = "Импорт одобрений. Укажите путь к файлу:"
  931.     $DoApprovalImportCheckBox.Checked = $false
  932.     $DoApprovalImportCheckBox.Add_Click({
  933.                                     DoApprovalImportCheckBox_OnClick    | Out-Null                         
  934.                                  })
  935.     $MainForm.Controls.Add($DoApprovalImportCheckBox)  | Out-Null
  936.  
  937.  
  938.  
  939.     #Поле ввода пути к файлу с данными для импорта
  940.     $TextBoxInputFile = New-Object System.Windows.Forms.TextBox
  941.     $TextBoxInputFile.Name = "TextBoxInputFile"
  942.     $TextBoxInputFile.Location = New-Object System.Drawing.Size(8,34)
  943.     $TextBoxInputFile.Size = New-Object System.Drawing.Size(688,20)
  944.     #$TextBoxInputFile.Text = Get-RegValue -Param $REGISTRY_STORE_INPUT_FILE_VALUE -DefaultValue $DEFAULT_USER_PATH
  945.     $TextBoxInputFile.Anchor = "Top, Left, Right"
  946.     $MainForm.Controls.Add($TextBoxInputFile) | Out-Null
  947.  
  948.  
  949.     #Кнопка открытия диалога выбора пути к папке с входными файлами
  950.     $BrowseButtonInputFile = New-Object System.Windows.Forms.Button
  951.     $BrowseButtonInputFile.Name = "BrowseButtonInputFile"
  952.     $BrowseButtonInputFile.Location = New-Object System.Drawing.Size(700,31)
  953.     $BrowseButtonInputFile.Size = New-Object System.Drawing.Size(75,25)
  954.     $BrowseButtonInputFile.Text = "Выбрать"
  955.     $BrowseButtonInputFile.Add_Click({
  956.                                 $SelPath = Open-FIleDialog -InitialPath $TextBoxInputFile.Text -DialogType "System.Windows.Forms.OpenFileDialog"   
  957.                                 if (($SelPath -ne $null) -and ($SelPath -ne ""))
  958.                                 {
  959.                                     $TextBoxInputFile.Text = $SelPath
  960.                                     $Res =  Set-RegValue -Value $SelPath -Param $REGISTRY_STORE_INPUT_FILE_VALUE                       
  961.                                 }  
  962.                             })
  963.     $BrowseButtonInputFile.Anchor = "Top,  Right"                      
  964.     $MainForm.Controls.Add($BrowseButtonInputFile) | Out-Null
  965.  
  966.  
  967.     #Чекбокс "Выполнить операцию экспорта"
  968.     $DoApprovalExportCheckBox = New-Object System.Windows.Forms.CheckBox
  969.     $DoApprovalExportCheckBox.Name = "DoApprovalExportCheckBox"
  970.     $DoApprovalExportCheckBox.Location = New-Object System.Drawing.Size(8,60)
  971.     $DoApprovalExportCheckBox.size = new-object System.Drawing.Size(400,20)  
  972.     $DoApprovalExportCheckBox.Text = "Экспорт одобрений. Укажите путь к файлу:"
  973.     $DoApprovalExportCheckBox.Checked = $false
  974.     $DoApprovalExportCheckBox.Add_Click({
  975.                                     DoApprovalExportCheckBox_OnClick | Out-Null
  976.                                  })
  977.     $MainForm.Controls.Add($DoApprovalExportCheckBox)  | Out-Null
  978.  
  979.  
  980.  
  981.  
  982.     #Поле ввода пути к результрующему файла (для экспорта)
  983.     $TextBoxOutputFIle = New-Object System.Windows.Forms.TextBox
  984.     $TextBoxOutputFIle.Name = "TextBoxOutputFIle"
  985.     $TextBoxOutputFIle.Location = New-Object System.Drawing.Size(8,80)
  986.     $TextBoxOutputFIle.Size = New-Object System.Drawing.Size(688,20)
  987.     #$TextBoxOutputFIle.Text = Get-RegValue -Param $REGISTRY_STORE_OUTPUT_FILE_VALUE -DefaultValue $DEFAULT_USER_PATH
  988.     $TextBoxOutputFIle.Anchor = "Top, Left, Right"
  989.     $MainForm.Controls.Add($TextBoxOutputFIle) | Out-Null
  990.  
  991.     #Кнопка открытия диалога выбора пути к папке, в которую будет сохранен результат
  992.     $BrowseButtonOutputFIle = New-Object System.Windows.Forms.Button
  993.     $BrowseButtonOutputFIle.Name = "BrowseButtonOutputFIle"
  994.     $BrowseButtonOutputFIle.Location = New-Object System.Drawing.Size(700,77)
  995.     $BrowseButtonOutputFIle.Size = New-Object System.Drawing.Size(75,25)
  996.     $BrowseButtonOutputFIle.Text = "Выбрать"
  997.     $BrowseButtonOutputFIle.Add_Click({
  998.                                 $SelPath = Open-FIleDialog  -InitialPath $TextBoxOutputFIle.Text "System.Windows.Forms.SaveFileDialog"
  999.                                 if (($SelPath -ne $null) -and ($SelPath -ne ""))
  1000.                                 {
  1001.                                     $TextBoxOutputFIle.Text = $SelPath
  1002.                                     $Res =  Set-RegValue -Value $SelPath -Param $REGISTRY_STORE_OUTPUT_FILE_VALUE                  
  1003.                                 }  
  1004.                             })
  1005.     $BrowseButtonOutputFIle.Anchor = "Top,  Right"                     
  1006.     $MainForm.Controls.Add($BrowseButtonOutputFIle) | Out-Null
  1007.  
  1008.     #------
  1009.     #Чекбокс "Перенос разрешений с тестовой группы серверов на боевую"
  1010.     $DoCopyApprovalsForServers = New-Object System.Windows.Forms.CheckBox
  1011.     $DoCopyApprovalsForServers.Name = "DoCopyApprovalsForServers"
  1012.     $DoCopyApprovalsForServers.Location = New-Object System.Drawing.Size(8,132)
  1013.     $DoCopyApprovalsForServers.size = new-object System.Drawing.Size(400,20)  
  1014.     $DoCopyApprovalsForServers.Text = "для серверов"
  1015.     $DoCopyApprovalsForServers.Checked = $false
  1016.     $DoCopyApprovalsForServers.Add_Click({
  1017.                                 #   Write-Host click
  1018.                                  })
  1019.     $MainForm.Controls.Add($DoCopyApprovalsForServers)  | Out-Null
  1020.  
  1021.     #Чекбокс "Перенос разрешений с тестовой группы рабочих станций на боевую"
  1022.     $DoCopyApprovalsForWorkStations = New-Object System.Windows.Forms.CheckBox
  1023.     $DoCopyApprovalsForWorkStations.Name = "DoCopyApprovalsForWorkStations"
  1024.     $DoCopyApprovalsForWorkStations.Location = New-Object System.Drawing.Size(8,162)
  1025.     $DoCopyApprovalsForWorkStations.size = new-object System.Drawing.Size(400,20)  
  1026.     $DoCopyApprovalsForWorkStations.Text = "для рабочих станций"
  1027.     $DoCopyApprovalsForWorkStations.Checked = $false
  1028.     $DoCopyApprovalsForWorkStations.Add_Click({
  1029.                                 #   Write-Host click
  1030.                                  })
  1031.     $MainForm.Controls.Add($DoCopyApprovalsForWorkStations)  | Out-Null
  1032.  
  1033.     #Кнопка "Выполнить". Запускает на исполнение основную функцию.
  1034.     $RunButton = New-Object System.Windows.Forms.Button
  1035.     $RunButton.Name = "RunButton"
  1036.     #$RunButton.Location = New-Object System.Drawing.Size(625,195)
  1037.     $RunButton.Location = New-Object System.Drawing.Size(700,195)
  1038.     $RunButton.Size = New-Object System.Drawing.Size(75,25)
  1039.     $RunButton.Anchor = "Bottom, Right"
  1040.     $RunButton.Text = "Выполнить"
  1041.     $RunButton.Add_Click(
  1042.                         {
  1043.                             Start-Run | Out-Null
  1044.                        
  1045.                         })
  1046.     $MainForm.Controls.Add($RunButton)| Out-Null
  1047.  
  1048.  
  1049.     #Кнопка отмены. Закрывает форму.
  1050.     #$CancelButton = New-Object System.Windows.Forms.Button
  1051.     #$CancelButton.Name = "CancelButton"
  1052.     #$CancelButton.Location = New-Object System.Drawing.Size(700,195)
  1053.     #$CancelButton.Size = New-Object System.Drawing.Size(75,25)
  1054.     #$CancelButton.Text = "Отмена"
  1055.     #$CancelButton.Anchor = "Bottom, Right"
  1056.     #$CancelButton.Add_Click({
  1057.     #                           Form-Close | Out-Null
  1058.     #                       })
  1059.     #$MainForm.Controls.Add($CancelButton) | Out-Null
  1060.  
  1061.     #Строка статуса
  1062.     $StatusBar = New-Object System.Windows.Forms.StatusBar
  1063.     $StatusBar.Name = "StatusBar"
  1064.     $StatusBar.Text = $DEFAULT_STATUS_BAR_TEXT
  1065.     $MainForm.Controls.Add($StatusBar) | Out-Null
  1066.  
  1067.     #--------------------------
  1068.     #Групбоксы - декоративные элементы
  1069.     ##Группировка полей путей 
  1070.     $BrowseGroupBox = New-Object System.Windows.Forms.GroupBox
  1071.     $BrowseGroupBox.Location = New-Object System.Drawing.Size(3,3)
  1072.     $BrowseGroupBox.Size = New-Object System.Drawing.Size(776,105)
  1073.     $BrowseGroupBox.Anchor = "Top, Left, Right"
  1074.     $BrowseGroupBox.Text = "Обмен данными:"
  1075.     $MainForm.Controls.Add($BrowseGroupBox)  | Out-Null
  1076.  
  1077.     ##Группиров чекбоксов
  1078.     $CheckBoxesGroupBox = New-Object System.Windows.Forms.GroupBox
  1079.     $CheckBoxesGroupBox.Location = New-Object System.Drawing.Size(3,110)
  1080.     $CheckBoxesGroupBox.Size = New-Object System.Drawing.Size(776,80)
  1081.     $CheckBoxesGroupBox.Text = "Одобрить тестовые обновления:"
  1082.     $CheckBoxesGroupBox.Anchor = "Top, Left, Right, Bottom"
  1083.     $MainForm.Controls.Add($CheckBoxesGroupBox)  | Out-Null
  1084.  
  1085.  
  1086.     #Загружаем настройки от прошлого сеанса из реестра
  1087.     Load-Settings | Out-Null   
  1088.  
  1089.     #Обрабатываем чекбоксы
  1090.     DoApprovalImportCheckBox_OnClick    | Out-Null 
  1091.     DoApprovalExportCheckBox_OnClick    | Out-Null 
  1092.  
  1093.     #Показываем форму
  1094.     [void] $MainForm.ShowDialog() | Out-Null
  1095. #----------------</GUI>----------------------------------------------------------
  1096. }
  1097. else #Если мы работаем в режиме командной строки
  1098. {
  1099.     Start-WSUSActions | out-null
  1100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement