2015-01-19 3 views
0

С помощью сообщества я, наконец, завершил базовый сценарий, который создаст группы работников, политики, параметры политики, а затем свяжет политики с группами работников.Оптимизация скрипта для создания политик фермы Citrix выполняется слишком медленно

У меня есть много write-hosts, чтобы увидеть, что происходит, и чтобы увидеть, где скрипт держится больше всего, будет удален по дороге.

Когда он устанавливает настройки set-ctxgrouppolicyconfiguration, он вялый. Скрипт занимает около 8-10 минут, что очень медленно. Центр приложений Citrix по своей сути медленный, когда вручную записывает каждую политику в SQL-сервер, поэтому не уверен, что это можно ускорить.

import-module Citrix.GroupPolicy.Commands 
add-pssnapin *Citrix* 

$count = 0 
$tomorrow = ConvertTo-DwordDate -date (get-date).AddDays(1) 
new-xafolder 'WorkerGroups/reboot schedules' 

$days = @("mon", "tues", "wed", "thurs", "fri", "sat", "sun") 
foreach ($day in $days) { 
    write-host "processing $day" 
    $count = $count + 1 

    write-host "creating workerGroup" 
    new-xaworkergroup "$day - 3am" -folderpath 'WorkerGroups/reboot schedules' -description "scheduled reboot for $day - 3am" 

    write-host "creating policy" 
    new-ctxgrouppolicy "reboot $day 3am" -type computer -priority $count 

    write-host "linking policy to workerGroup" 
    add-ctxgrouppolicyfilter "reboot $day 3am" computer servergroup0 workergroup "$day - 3am" 

    write-host "setting reboot parameters" 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer scheduledReboots enabled 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootWarningMessage enabled 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootWarningStartTime enabled -value start60MinutesBeforeReboot 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootWarningInterval enabled -value every10Minutes 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootScheduleTime enabled  -value 180 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootScheduleFrequency enabled -value 7 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootDisableLogOnTime enabled -value disable15MinutesBeforeReboot 
    set-ctxgrouppolicyconfiguration "reboot $day 3am" computer rebootScheduleStartDate enabled -value $tomorrow 
} 
$count = $count + 1 
set-ctxgrouppolicy -policyname unfiltered -type computer -priority $count 

write-host "script complete" 

#------------------------------ 
#functions for date conversion 
#------------------------------ 

function convertFrom-DwordDate([int32]$DwordValue){ 
    #ex. $DwordValue = 132055314 
    #convert to hex 
    $hex = $DwordValue.ToString('X8') 
    #$Ex. $hex = 0x07df0112 = 0x07df (year) 0x01(month) 0x12 (day) 

    #Convert to date string 
    $datestring = '{0:D4}\{1:D2}\{2:D2}' -f [convert]::ToUInt32($hex.Substring(0,4),16), [convert]::ToUint32($hex.Substring(4,2),16), [convert]::ToUInt32($hex.Substring(6,2),16) 
    #convert to datetime and output 
    $datetime = [datetime]::ParseExact($datestring,'yyyy\\MM\\dd',$null) 
    #output 
    $datetime 
} 

function ConvertTo-DwordDate([datetime]$Date) { 
    #convert to combined hex 
    $combinedhex = '{0:X}{1:X2}{2:X2}' -f $Date.Year, $Date.Month, $Date.Day 
    #convert to decimal 
    $decimal = [convert]::ToUInt32($combinedhex,16) 
    #output 
    $decimal 
} 

ответ

1

Я не знаком с Citrix SDK, но, глядя на this site, кажется, что вы могли бы Получать всю политику в качестве объекта. Я бы предложил сделать это, чтобы вы могли изменить его локально и сохранить объект GPO один раз в конце каждого «дня» в вашем цикле. Это заменит 8 сбережений с 1. Что-то вроде этого:

ПРЕДОСТЕРЕЖЕНИЕ: НЕ ИСПЫТАНО! Сначала прочитайте и попробуйте в тестовой среде. Как сказано, у меня нет опыта работы с этим модулем и я не могу гарантировать, что он работает так, как ожидалось, или вообще. Вы также можете попробовать сначала запустить команды вручную, а не весь цикл, чтобы свести к минимуму возможный «ущерб».

import-module Citrix.GroupPolicy.Commands 
add-pssnapin *Citrix* 

$count = 0 
$tomorrow = ConvertTo-DwordDate -date (get-date).AddDays(1) 
new-xafolder 'WorkerGroups/reboot schedules' 

#Not sure if needed or if you could remove this and -DriveName CitrixGPO commands later 
#Add PowerShell snapins (if necessary) 
if ((Get-PSSnapin -Name Citrix.Common.GroupPolicy -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin Citrix.Common.GroupPolicy } 
if ((Get-PSSnapin -Name Citrix.Common.Commands -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin Citrix.Common.Commands } 
if ((Get-PSSnapin -Name Citrix.XenApp.Commands -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin Citrix.XenApp.Commands } 
New-PSDrive -Name CitrixGPO -PSProvider CitrixGroupPolicy -Root \ -DomainGPO "Citrix GPO" 
#END "not sure if needed" 


$days = @("mon", "tues", "wed", "thurs", "fri", "sat", "sun") 
foreach ($day in $days) { 
    write-host "processing $day" 
    $count = $count + 1 

    write-host "creating workerGroup" 
    new-xaworkergroup "$day - 3am" -folderpath 'WorkerGroups/reboot schedules' -description "scheduled reboot for $day - 3am" 

    write-host "creating policy" 
    new-ctxgrouppolicy "reboot $day 3am" -type computer -priority $count 

    write-host "linking policy to workerGroup" 
    add-ctxgrouppolicyfilter "reboot $day 3am" computer servergroup0 workergroup "$day - 3am" 

    write-host "getting policy" 
    $objCitrixPolicy = Get-CtxGroupPolicyConfiguration -PolicyName "reboot $day 3am" -Type compuer -DriveName CitrixGPO #-DriveName CitrixGPO might not be needed 

    write-host "modifying policy" 
    $objCitrixPolicy.("scheduledReboots").State = "Enabled" 

    $objCitrixPolicy.("rebootWarningMessage").State = "Enabled" 

    $objCitrixPolicy.("rebootWarningStartTime").State = "Enabled" 
    $objCitrixPolicy.("rebootWarningStartTime").Value = "start60MinutesBeforeReboot" 

    $objCitrixPolicy.("rebootWarningInterval").State = "Enabled" 
    $objCitrixPolicy.("rebootWarningInterval").Value = "every10Minutes" 

    $objCitrixPolicy.("rebootScheduleTime").State = "Enabled" 
    $objCitrixPolicy.("rebootScheduleTime").Value = 180 

    $objCitrixPolicy.("rebootScheduleFrequency").State = "Enabled" 
    $objCitrixPolicy.("rebootScheduleFrequency").Value = 7 

    $objCitrixPolicy.("rebootDisableLogOnTime").State = "Enabled" 
    $objCitrixPolicy.("rebootDisableLogOnTime").Value = "disable15MinutesBeforeReboot" 

    $objCitrixPolicy.("rebootScheduleStartDate").State = "Enabled" 
    $objCitrixPolicy.("rebootScheduleStartDate").Value = $tomorrow 

    write-host "saving policy" 
    Set-CtxGroupPolicyConfiguration $objCitrixPolicy -DriveName CitrixGPO #-DriveName CitrixGPO might not be needed 

} 
$count = $count + 1 
set-ctxgrouppolicy -policyname unfiltered -type computer -priority $count 

#Close PowerShell Drive from Citrix domain GPO 
Remove-PSDrive -Name CitrixGPO 

write-host "script complete" 

#------------------------------ 
#functions for date conversion 
#------------------------------ 

function convertFrom-DwordDate([int32]$DwordValue){ 
    #ex. $DwordValue = 132055314 
    #convert to hex 
    $hex = $DwordValue.ToString('X8') 
    #$Ex. $hex = 0x07df0112 = 0x07df (year) 0x01(month) 0x12 (day) 

    #Convert to date string 
    $datestring = '{0:D4}\{1:D2}\{2:D2}' -f [convert]::ToUInt32($hex.Substring(0,4),16), [convert]::ToUint32($hex.Substring(4,2),16), [convert]::ToUInt32($hex.Substring(6,2),16) 
    #convert to datetime and output 
    $datetime = [datetime]::ParseExact($datestring,'yyyy\\MM\\dd',$null) 
    #output 
    $datetime 
} 

function ConvertTo-DwordDate([datetime]$Date) { 
    #convert to combined hex 
    $combinedhex = '{0:X}{1:X2}{2:X2}' -f $Date.Year, $Date.Month, $Date.Day 
    #convert to decimal 
    $decimal = [convert]::ToUInt32($combinedhex,16) 
    #output 
    $decimal 
} 
+1

$ Frode F. Это заняло около минуты 90 секунд от сценария. Те, кто пишет о политике, просто требуют времени, но улучшение в 90 секунд плохое! – soMuch2Learn

+0

Я добавил следующее, и скрипт пошел с 8.5 минут до 35 секунд! '(get-psdrive LocalFarmGPO) .autowriteback = $ false' был вставлен до того, как я установил параметры политики, и когда закончите, я добавил' (get-psdrive LocalFarmGPO) .Save() (get-psdrive LocalFarmGPO) .autowriteback = $ true' и удаляется при завершении 'Remove-PSDrive -Name NewFarm'. Просто FYI на тот случай, если кто-то еще столкнется с присущей вялостью написанием политик citrix с PS. – soMuch2Learn