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/
или я один такой особенный, что отключил swap с памятью 2 ГБ на WinXP SP3? UPD. powerShell не нра, потому что тащит за собой .NET фреймворк. не хотеть, пусть его и обольют журналюги словесами радужными. НЕТ, и всё тут. но API скачаю и натравлю на него JavaScript )) так будет лучше, не правда ли ?
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() }
+ Если он есть то будет сможет обслуживать более объемные программы и обслуживать одновременно большое количество пользователей. Если же выключен. То повышает быстродействие, увеличивает время доступа Так что думаю ты все правильно сделал, аналогично и у меня вырублен