SUP: Skype for Windows

В продуктах появилась новая программа для обновлений — Skype for Windows. Ни для кого не секрет, что Скайп был выкуплен компанией Майкрософт, так что больше не будет необходимости создавать вручную обновления через SCUP. Единственное, что удручает, — это включенный в дистрибутив Bing Bar. С обновлением можно ознакомиться здесь — http://support.microsoft.com/kb/2692954.
Skype for Windows

Реклама

OSD: «Склеивание» WIM файлов

Решил написать совсем небольшой скрипт, который склеивает WIM-файлы из определенной директории в один WIM-файл. Для работы скрипта требуется Windows AIK, а точнее утилита ImageX.
Merge-WimFile.ps1:

Param (
	[Parameter(mandatory = $true)][string]$Path,
	[Parameter(mandatory = $true)][string]$Destination,
	[Parameter(mandatory = $false)][string]$Filter
)

$Imagex = "$env:ProgramFiles\Windows AIK\Tools\$env:processor_architecture\Imagex.exe"
$WimFiles = Get-ChildItem -Path $Path -Filter $Filter
if (Test-Path $Imagex) {
	foreach ($WimFile in $WimFiles) {
		&$Imagex /Export $WimFile.fullname 1 $Destination ($WimFile.Name -replace $WimFile.Extension)
	}
}
else {
	Write-Error "ImageX.exe not found."
}

В данном скрипте необходимо задать параметры -Path — путь до директории с WIM-файлами и -Destination — путь до WIM-файла, в который будут сохраняться все образы. Можно также задать параметр -Filter, в котором можно задать маску файлов для склеивания. Склеивание образа имеет существенный плюс — размер. В WIM образ файлы попадают в единственном числе и если какой либо файл уже есть в WIM-файле, то на него просто будет создана ссылка.

Вот демонстрация того, сколько у меня занимают семь образов по отдельности:

Splited Files
Files before

А вот размер одного WIM-файла, который содержит в себе эти же самые семь образов:
Image Before

Вот как выглядит склеенный загруженный образ в Configuration Manager:
Image in ConfigMgr

Если Вы обратили внимание, то скрипт написан так, что он присваивает к имени образа имя файла. Но у склеенного образа есть и обратная сторона — если образы сильно отличаются друг от друга, то размер файла будет довольно большим, а преимущества никакого не будет и также, в случае, когда контент загружается на локальный диск с точки распространения, а не запускается напрямую с нее, то время на доставку уйдет больше. Выбирать Вам!

MP: Windows Server Operating System Management Pack

Две недели назад вышла новая версия (6.0.6972.0) пакетов управления для операционной системы Windows Server.

Страница загрузки: http://www.microsoft.com/en-us/download/details.aspx?id=9296.

MP: Exchange Server 2010 Monitoring Management Pack

Вышла новая версия (14.3.38.2) пакета управления для Microsoft Exchange 2010.
Страница загрузки: http://www.microsoft.com/en-us/download/details.aspx?id=692.
Данный пакет управления временно недоступен из-за наличия ошибок!

http://blogs.technet.com/b/exchange/archive/2012/06/28/mailboxes-on-a-database-are-quarantined-in-an-environment-with-system-center-operations-manager.aspx

SUP: Для тех, кто не любит ждать

Совсем небольшой скрипт для тех случаев, когда ОС нужно обновить, но по какой-то причине установка обновлений не прошла в процессе OSD. Процесс обновления в Configuration Manager требует большего времени, нежели установка обновлений через WSUS, поэтому это наиболее подходящий способ быстро обновиться.

# Путь до исходной папки с обновлениями
$Path = "\\Domain\ConfigMgr\Updates\Microsoft\Windows Server 2008 R2"
$Updates = Get-ChildItem -Path $Path -Filter "*.cab" -Recurse
Foreach ($Update in $Updates) {
	&Dism /Online /Add-Package:$($Update.fullname) /NoRestart
}

В моем случае в качестве пути используется доменный DFS-link. В переменной Path требуется указать путь до папки с обновлениями. Такой трюк пройдет только для ОС Windows Server 2008/Vista SP2 и выше.

RS: Отчет по членству локальных групп

Скорее всего многим поступала задача от руководства — определить пользователей, которые входят в группу локальных администраторов и многие решали этот вопрос с помощью скриптов, которые есть в интернете. Но все скрипты, которые я видел, хороши до тех пор, пока не сталкиваешься с разноязычными операционными системами в одной компании. В таких случаях группа администраторов может называться «Администраторы», «Administrators», где-то еще как-то, а кому-то вообще нужен отчет по пользователям и группам, которые входят не в группу локальных администраторов, а в группу пользователей удаленного рабочего стола. В итоге я решил написать скрипт, взяв за основу скрипт Sherry Kissinger. Этот скрипт будет создавать собственный класс — Win32_LocalGroupMember. Данный класс обновляется с помощью адвертайзмента и распространяется на коллекцию «All Systems» (либо собственную), либо через Desired Configuration Management.

' Set variables

Set oWMI = GetObject("winmgmts:root\cimv2")
cDQT = Chr(34)
cSQT = Chr(39)
iCimtypeString = 8
sClassName = "Win32_LocalGroupMember"

' Exit script if computer is a Domain Controller

For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
	if (oComputer.DomainRole >= 4) then Wscript.Quit
Next

' Clear class if exists

For Each oSubclass in oWMI.SubclassesOf()
	if oSubclass.Path_.Class = sClassName then oWMI.Get(sClassName).Delete_
Next

' Create class

Set oClass = oWMI.Get()
oClass.Path_.Class = sClassName
oClass.Properties_.add "MemberName" , iCimtypeString
oClass.Properties_.add "MemberDomain" , iCimtypeString
oClass.Properties_.add "MemberType" , iCimtypeString
oClass.Properties_.add "GroupName" , iCimtypeString
oClass.Properties_.add "GroupSID" , iCimtypeString
oClass.Properties_("GroupName").Qualifiers_.add "key" , True
oClass.Properties_("MemberName").Qualifiers_.add "key" , True
oClass.Put_

' Return data to class

Set oClass = oWMI.Get(sClassName).SpawnInstance_
For Each oGroup in oWMI.ExecQuery("Select * From Win32_Group Where LocalAccount = 1")
	For Each oGroupUser in oWMI.ExecQuery("Select PartComponent From Win32_GroupUser Where GroupComponent = "_
	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="_
	&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
		aSplit = split(oGroupUser.PartComponent,cDQT)
		Select Case lcase(split(aSplit(0),":")(1))
			Case "win32_systemaccount.domain="
				oClass.MemberType = "SystemAccount"
			Case "win32_useraccount.domain="
				oClass.MemberType = "UserAccount"
			Case "win32_group.domain="
				oClass.MemberType = "Group"
			Case Else
				oClass.MemberType = "Unknown"
		End Select
		oClass.MemberName = aSplit(3)
		oClass.MemberDomain = aSplit(1)
		oClass.GroupName = oGroup.Name
		oClass.GroupSID = oGroup.SID
		oClass.Put_
	Next
Next

Далее нам потребуется изменить файл sms_def.mof и добавить в него следующие строки:

//**************************************************************************
//* Class: Win32_LocalGroupMember
//**************************************************************************

[ SMS_Report     (TRUE),
  SMS_Group_Name ("Local Group Member"),
  SMS_Class_ID   ("CUSTOM|LocalGroupMember|1.0") ]
class Win32_LocalGroupMember : SMS_Class_Template
{
	[SMS_Report (TRUE), key ] string MemberName;
	[SMS_Report (TRUE)      ] string MemberDomain;
	[SMS_Report (TRUE)      ] string MemberType;
	[SMS_Report (TRUE), key ] string GroupName;
	[SMS_Report (TRUE)      ] string GroupSID;
};

Следующим этапом требуется запустить данный скрипт на клиентах, причем делать это следует регулярно. Желательно скрипт запускать с той же частотой, что и аппаратная инвентаризация. Т.е. если у вас инвентаризация проходит раз в три дня, то и скрипт запускать следует раз в три дня. После этого можно уже построить отчет по группам, указывая не имя, а SID группы. Список SID встроенных групп можно найти здесь — http://support.microsoft.com/kb/243330. Вот самый простой отчет по доменным пользователям, которые входят в группу локальных администраторов:

SELECT SYS.Name0, GroupName0[Local Group Name], MemberDomain0[Member Domain], MemberName0[Member Name], MemberType0[Type]
FROM v_GS_LocalGroupMember0 LGM
INNER JOIN v_R_System SYS on SYS.ResourceID = LGM.ResourceID
WHERE LGM.GroupSID0 = 'S-1-5-32-544' and LGM.MemberDomain0 != SYS.Name0 and LGM.MemberType0 = 'UserAccount'
ORDER by SYS.Name0

UPDATE 27.06.2014: В ConfigMgr 2012 R2 создается таблица в виде v_GS_CUSTOM_LocalGroupMember0, соответственно запрос будет выглядеть так:

SELECT SYS.Name0, GroupName0[Local Group Name], MemberDomain0[Member Domain], MemberName0[Member Name], MemberType0[Type]
FROM v_GS_CUSTOM_LocalGroupMember0 LGM
INNER JOIN v_R_System SYS on SYS.ResourceID = LGM.ResourceID
WHERE LGM.GroupSID0 = 'S-1-5-32-544' and LGM.MemberDomain0 != SYS.Name0 and LGM.MemberType0 = 'UserAccount'
ORDER by SYS.Name0

Upgrade: System Center 2012 SP1 CTP2

На этой неделе стала доступна пре-релиз версия 2 SP1 для линейки System Center 2012 — http://www.microsoft.com/en-us/download/details.aspx?id=30133. Что добавлено:

Virtual Machine Manager:

  • Улучшена поддержка виртуальной сети;
  • Добавлены расширения для консоли VMM;
  • Возможность конвертировать VHD диски в формат VHDX;
  • Поддержка последних версий XenServer и vSphere.

Configuration Manager и Endpoint Protection:

  • Поддержка Windows 2012;
  • Поддержка клиентов MacOS ;
  • Поддержка Linux/Unix серверов;
  • Командлеты PowerShell.

Data Protection Manager:

  • Увеличена производительность при резервном копировании CSV 2.0:
  • Защита Hyper-V в сетевой папке;
  • Защита Windows Server 2012;
  • Непрерывная защита при Live-миграции виртуальной машины.

Operations Manager:

  • Поддержка IIS8.

Что еще хотелось бы отметить, изменения также коснулись и других продуктов System Center 2012 — это Service Center, App Controller и Orchestrator. Все эти продукты с установленным SP1 CTP2 поддерживают Windows Server 2012 RC и SQL Server 2012. Данный пре-релиз возможно установить только на англоязычные продукты.