Новости из Блогов SCCM и Powershell

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 18 Jun 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,373
    Likes Received:
    6,619
    Reputations:
    693
    SCCM и Powershell



    Самая неприятная минута возникает когда на дисках заканчивается место. В этот момент с ужасом понимаешь что либо что то придется удалять, либо что то переносить или что то придумывать.

    Знакомо?

    Одну из методик переноса я описывал в статье про то как поменять местоположение сигнатур антивируса, которые находятся на системном диске (спасибо МС :) ). Там предлагается использовать утилиту LinkD.exe.
    Примечание: Методика применима к любому объекту который необходимо перенести на другую партицию.

    Сегодня речь пойдет не про чистку дисков, а про то чем может помочь PowerShell при работе с настройками SCCM агента. Про диски будет, но в самом конце заметки.

    Начнем с простого, посмотрим что можно получить от установленного SCCM клиента.
    Code:
    $smsClient = New-Object -ComObject Microsoft.SMS.Client
    Запрашиваем участников
    Code:
    $smsClient | Get-Member
    Получаем довольно увесистый список.
    Code:
    TypeName: System.__ComObject#{d535c884-6b82-47dd-9a15-09e98b95136e}
    
    Name MemberType Definition
    —- ———- ———-
    AutoDiscoverSite Method string AutoDisc
    ClearProxy Method void ClearProxy
    DiscoverDefaultMP Method string Discover
    EnableAutoAssignment Method void EnableAuto
    GetAssignedSite Method string GetAssig
    …
    Из списка методов видно что там есть традиционные “Get” и “Set”, с их помощью можно получать и задавать доступные параметры.

    Например получить индекс сайта приписки можно командой.
    Code:
    $smsClient.GetAssignedSite()
    А задать другой командой.
    Code:
    $smsClient.SetAssignedSite("S01")
    Аналогично можно получить адрес точки управления
    Code:
    $smsClient.GetCurrentManagementPoint()
    Задаем аналогичной командой
    Code:
    $smsClient.SetCurrentManagementPoint("SCCM-01.LAB.LOCAL",0)
    В дополнении к методу представленному выше можно использовать методы доступные в апплете CPAppletMgr
    Code:
    $cpAppletMgr = New-Object -ComObject CPApplet.CPAppletMgr
    Изучаем что есть внутри
    Code:
    $cpAppletMgr | Get-Member
    
    TypeName: System.__ComObject#{279463bb-1034-4fb5-878e-4a330a08beab}
    
    Name MemberType Definition
    —- ———- ———-
    GetClientActions Method IClientActions GetClientActions ()
    GetClientComponents Method IClientComponents GetClientComponents ()
    GetClientProperties Method IClientProperties GetClientProperties ()
    и дергаем по очереди все найденные методы.
    Code:
    $cpAppletMgr.GetClientActions() | select Name
    результатом будет список доступных действий.
    Code:
    Name
    ----
    Software Metering Usage Report Cycle
    Request & Evaluate Machine Policy
    Updates Source Scan Cycle
    Request & Evaluate User Policy
    Hardware Inventory Collection Cycle
    Software Inventory Collection Cycle
    Application Global Evaluation Task
    Software Updates Assignments Evaluation Cycle
    Discovery Data Collection Cycle
    MSI Product Source Update Cycle
    Standard File Collection Cycle
    Если нам требуется вызвать определенное действие то запрашиваем его по имени и выполняем.
    Code:
    $machinePolicy = $cpAppletMgr.GetClientActions() | Where-Object { $_.Name -eq "Request & Evaluate Machine Policy" }
    $machinePolicy.PerformAction()
    Или так
    Code:
    (New-Object –COMObject CPApplet.cpappletmgr).GetClientActions() | ? {$_.Name –like ‘Hardware*’} |% {$_.PerformAction()}
    Каждое действие имеет свой ActionID:

    • Hardware Inventory – 00000000-0000-0000-0000-000000000001
    • Software Inventory – 00000000-0000-0000-0000-000000000002
    • Data Discovery – 00000000-0000-0000-0000-000000000003
    • Machine Policy Assignment Request – 00000000-0000-0000-0000-000000000021
    • Machine Policy Evaluation – 00000000-0000-0000-0000-000000000022
    • Refresh Default Management Point – 00000000-0000-0000-0000-000000000023
    • Refresh Location (AD site or Subnet) – 00000000-0000-0000-0000-000000000024
    • Software Metering Usage Reporting – 00000000-0000-0000-0000-000000000031
    • Sourcelist Update Cycle – 00000000-0000-0000-0000-000000000032
    • Refresh proxy management point – 00000000-0000-0000-0000-000000000037
    • Cleanup policy – 00000000-0000-0000-0000-000000000040
    • Validate assignments – 00000000-0000-0000-0000-000000000042
    • Certificate Maintenance – 00000000-0000-0000-0000-000000000051
    • Branch DP Scheduled Maintenance – 00000000-0000-0000-0000-000000000061
    • Branch DP Provisioning Status Reporting – 00000000-0000-0000-0000-000000000062
    • Software Update Deployment – 00000000-0000-0000-0000-000000000108
    • State Message Upload – 00000000-0000-0000-0000-000000000111
    • State Message Cache Cleanup – 00000000-0000-0000-0000-000000000112
    • Software Update Scan – 00000000-0000-0000-0000-000000000113
    • Software Update Deployment Re-eval – 00000000-0000-0000-0000-000000000114
    • OOBS Discovery – 00000000-0000-0000-0000-000000000120

    Поэтому действия можно вызывать не только по именам, но и по их идентификаторам
    Code:
    $machinePolicy = $cpAppletMgr.GetClientActions() | Where-Object { $_.ActionID -eq "00000000-0000-0000-0000-000000000113" }
    $machinePolicy.PerformAction()
    Если требуется выполнить это действие на другом компьютере то понадобится скрипт
    Code:
    $Computer = "HOST_NAME"
    $Method = "TriggerSchedule"
    $Sched = "{00000000-0000-0000-0000-000000000001}"
    $MC = [WmiClass]"\\$Computer\ROOT\ccm:SMS_Client"
    $InParams = $mc.psbase.GetMethodParameters($Method)
    $InParams.sScheduleID = $Sched
    $R = $mc.PSBase.InvokeMethod($Method, $inParams, $Null)
    Последнее про что следует сказать это методика управления размером и местоположением кэша SCCM клиента

    Запрашиваем информацию по настройкам кэша.
    Code:
    $ccm = Get-WmiObject -Namespace root\ccm\SoftMgmtAgent -Class CacheConfig
    $ccm.size
    $ccm.location
    Для изменения этих параметров необходимо воспользоваться скриптом
    Code:
    $ccm = Get-WmiObject -Namespace root\ccm\SoftMgmtAgent -Class CacheConfig
    $ccm.Location = "d:\fullpath_to\cache"
    $ccm.Size = "3096"
    $ccm.Put()

    Опубликовано: 18.06.2012
    Сергей Мариничев
    http://blog.wadmin.ru/2012/06/sccm-powershell/
     
  2. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,697
    Likes Received:
    3,139
    Reputations:
    236
    или я один такой особенный, что отключил swap с памятью 2 ГБ на WinXP SP3?

    UPD.
    powerShell не нра, потому что тащит за собой .NET фреймворк.
    не хотеть, пусть его и обольют журналюги словесами радужными.

    НЕТ, и всё тут.
    но API скачаю и натравлю на него JavaScript ))

    так будет лучше, не правда ли ?
     
    #2 altblitz, 18 Jun 2012
    Last edited: 18 Jun 2012
  3. RexTiam

    RexTiam Member

    Joined:
    2 Nov 2009
    Messages:
    113
    Likes Received:
    45
    Reputations:
    5
    Не один, смысла нету столько
     
  4. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,697
    Likes Received:
    3,139
    Reputations:
    236
    2-4 ГБ памяти - смысла нет в swap файле.

    PowerShell или JS/VB host?

    второе - проще в отладке, читает и пишет файлы на локальном диске.

    PHP:
    function Host() {  this.WshShell=Wscript.CreateObject('Wscript.Shell')
    this.WshNetwork=Wscript.CreateObject('Wscript.Network')
    this.WshFSO=new ActiveXObject('Scripting.FileSystemObject')
    this.WshArgs=Wscript.Arguments  this.ProgID=new String(" . : k n a p s t e r  . : : .  <" this.WshNetwork.UserName "@" this.WshNetwork.ComputerName "> : .")
    this.pad=this.WshFSO.GetFolder('.')
    this.root=this.pad.isRoot()
    this.file  this.stream  this.msg=''  this.reTerminalStrip='([A-Z]*X+[A-Z0-9]*)([ \t]+)(P+E+|[0-9]+)'  this.reTerminalStripValue='^([A-Z]*X+[A-Z0-9]*)'

    this.readFile=readFile
    this
    .writeFile=writeFile
    this
    .CMSFileName=CMSFileName  

    this
    .parseStream=parseStream }

    function 
    readFile(file) {  this.file=WshFSO.OpenTextFile(file,READ,false)
    this.stream=this.file.ReadAll()+'\n'  this.file.Close() }

    function 
    writeFile(file) {  this.file=WshFSO.OpenTextFile(file,WRITE,true)
    this.file.Write(this.stream)  this.file.Close() }
     
  5. sasha.seven

    sasha.seven Banned

    Joined:
    4 Jun 2011
    Messages:
    45
    Likes Received:
    6
    Reputations:
    1
    + Если он есть то будет сможет обслуживать более объемные программы и обслуживать одновременно большое количество пользователей.
    Если же выключен.
    То повышает быстродействие, увеличивает время доступа:)
    Так что думаю ты все правильно сделал, аналогично и у меня вырублен:)