39 заметок с тегом

windows

Развертывание и использование WSUS сервера

Установка обновлений и патчей является очень важной составной частью обеспечения безопасности. Для всех специалистов по информационной безопасности основной необходимостью является мониторинг, анализ и устранение уязвимостей программного обеспечения. Компания Microsoft предоставляет бесплатную возможность использования сервиса обновлений своих программных продуктов в течение всего времени поддержки программного продукта. Необходимые обновления доступны через сеть интернет всем пользователям программных продуктов.

Применение обновлений к корпоративной среде требует дополнительных механизмов управления. Microsoft предлагает использовать в корпоративной среде мощный бесплатный продукт Windows Server Update Services (WSUS), который позволяет экономить трафик в сети Интернет, централизованно управлять обновлениями для серверов и рабочих станций.

В данной статье будет рассмотрен опыт установки и обслуживания WSUS в корпоративной среде, который позволит новичкам избежать ряда «подводных камней».

Установка WSUS

В рамках ОС Windows Server 2008 существует роль сервера Windows Server Update Services.

Для Windows Server 2003 следующие системные требования к установке WSUS 3.0 SP1:

  • Операционная система: Windows Server 2003 SP1 и выше.
  • Дополнительные роли сервера: IIS 6.0 и выше
  • Дополнительные обновления ОС: Microsoft .NET Framework 2.0, Microsoft Management Console 3.0.
  • Дополнительные программы: Microsoft Report Viewer, SQL Server 2005 SP1 (Служба WSUS способна установить внутреннюю службу Windows Internal Database).

Несмотря на то, что служба практически не требовательна к процессору и оперативной памяти, ей необходима изрядная доля дискового пространства. Желательно 40 Гб и более. В конечном итоге, размер занимаемого дискового пространства будет зависит от количества продуктов, которые необходимо обновлять, и количества требуемых обновлений в инфраструктуре.

Если при установке сервер не удовлетворяет системным требования, то появится окно предупреждения, в котором будет описано что необходимо установить.

Настройка сервера WSUS

Для нормальной работы сервера необходимо указать ряд параметров, которые делаются с помощью «Мастер настройки Windows Server Update Services»

В окне «Выбор вышестоящего сервера» необходимо указать пункт «Синхронизировать с Центром обновлений Майкрософт».

При применении к корпоративной среде прокси-сервера в окне «Настройка прокси-сервера» необходимо указать IP адрес, номер порта и параметры аутентификации на прокси-сервере.

В окне «Выбор языков» необходимо выбрать пункт «Загружать обновления только на следующих языках» обязательно выбрать «Английский». Выбор остальных языков необходимо делать исходя из систем, установленных в компании, обычно ещё добавляют «Русский». Нет необходимости выбирать «Загружать обновления на всех языках, включая новые», так как это увеличит количество обновлений, хранящихся на дисковом пространстве.

В окне «Выбор продуктов» необходимо указать продукты, установленные в рамках корпоративной среды. ВНИМАНИЕ! Никогда не устанавливаете все продукты, так как это может привести к увеличению размера хранимых обновлений, при этом обновления не будут использоваться. Необходимо методично и последовательно выбрать только те продукты которые используются в рамках корпоративной среды.

В окне «Выбор классов» необходимо указать только те классы которые требуют обновлений. Так как указание лишних классов в значительной степени увеличивает размер хранимых обновлений.

В окне «Настройка расписания синхронизации» необходимо выбрать время синхронизации. В рамках WSUS синхронизации не предполагает загрузку обновлений. В данном случае синхронизация будет производить только обновление информации с сервера Центра обновлений Майкрософт».

После первой синхронизации необходимо открыть консоль WSUS и выбрать «Параметры». В «Параметры» открыть пункт «Файлы и языки обновлений».

Во вкладке «Файлы обновлений» окна «Файлы и языки обновлений» необходимо указать каким образом будет осуществляться хранение файлов обновлений. Так как мы хотим уменьшить размер Интернет трафика, то необходимо выбрать «Хранить файлы обновлений локально на этом сервере» и ОБЯЗАТЕЛЬНО! выбираем пункты «загружать файлы обновлений на сервер только после одобрения обновления» и «Загружать файлы экспресс — установки». Пункт «Загружать файлы обновлений на сервер только после одобрения обновления» необходим, так как по умолчанию сервер загрузить ВСЕ обновления, которые он посчитает необходимым для выбранных продуктов. Однако так как с течением времени очень многие обновления аккумулируются в Service Pack, то вероятнее всего они не будут нужны и займут дисковое пространство.

После всех настроек необходимо добавить компьютеры в службу WSUS.

Добавление компьютеров в службу WSUS

Если у Вас есть домен, то достаточно в его групповой политике прописать службу WSUS и выбрать правила обновления компьютеров.

Это делается следующим образом «Пуск — Администрирование — Управление групповой политикой». Выбираем ту политику, которая действует в домене (по умолчанию Default Group Policy). Кликаем правой кнопкой и выбираем «Изменить».

В окне «Редактор управления групповыми политиками» заходим «Конфигурация компьютера — Политики — Административные шаблоны — Компоненты Windows — Центр обновления Windows». Выбираем пункт «Указать размещение службы обновлений в Интрасети ».

В окне «Свойства: Указать размещение службы обновлений в Интрасети» указываем параметр «Включен» и в строке «Укажите службу обновление в интрасети для поиска обновлений» прописываете строку вида: http:// [ip адрес или DNS имя сервера обновления в сети]. Копируете адрес в окно «Укажите сервер статистики в интрасети» (рис. 12). В рамках редактора групповой политики есть подсказки в окне объяснений.

Также необходимо определить политику обновлений. Это делается через пункт «Настройка автоматических обновлений».

В окне «Свойства: Настройка автоматических обновлений» указываем параметр «Включен» и параметры «Настройка автоматического обновления», «Установка по расписанию — день», «Установка по расписанию — время». В окне «Объяснение» есть описание всех параметров для серверов и желательно устанавливать параметр «2 —уведомления о загрузке и установке», что позволит администраторам выбирать время установки обновлений на сервера.

Если в рамках инфраструктуры присутствуют рабочие места которые не входят в состав домена (например мобильные рабочие места), но служба обновлений для этих рабочих мест необходима, то существует возможность указания этой службы в «Локальной политике безопасности».

В командной строке набираем gpedit.msc и проделываем те же операции, которые были описаны выше для групповой политики в домене.

Через некоторое время компьютер появится в окне «Компьютеры — Все компьютеры — Не назначенные компьютеры» при «Состояние: Любой».

Управление обновлениями

Для того чтобы увидеть и одобрить необходимые обновления нужно в «Обновления — Все обновления» выбрать следующие пункты фильтра: «Одобрение: Неодобренные» и Состояние: Требуется» и нажать «Обновить». ВНИМАНИЕ! для проверки необходимых обновлений всегда обращайте внимание, чтобы настройки фильтра стояли в положениях «Одобрение: Неодобренные» и Состояние: Требуется», иначе вы рискуете загрузить ненужные вам обновления, или не загрузить их вообще. В случае, если фильтр в настройках «Одобрение: Неодобренные» и Состояние: Требуется» показал пустое поле, то все необходимые обновления для компьютеров уже одобрены и находятся на сервере.

После одобрения на компьютере через какое-то время появятся обновления согласно правилам, настроенным в политике безопасности.

Достаточно часто существует необходимость принудительной проверки обновлений на сервере обновлений со стороны компьютера. Для этого существует программа wuauclt.exe, которая запускается через командную строку. Для проверки обновлений её необходимо запускать с ключом /detectnow (wuauclt.exe /detectnow). Для посылки отчета о состоянии (очень часто необходимо при первом подключении к серверу обновлений) необходимо запускать с ключом /reportnow (wuauclt.exe /reportnow).

 51   2017   windows   wsus

Перемещение пользовательских баз данных

SQL Server позволяет переносить в новое место файлы данных, журнала и полнотекстового каталога пользовательской базы данных. Новое место указывается при помощи предложения FILENAME инструкции ALTER DATABASE. Этот метод подходит для перемещения файлов базы данных в пределах одного экземпляра SQL Server. Для переноса базы данных на другой экземпляр SQL Server или другой сервер применяются операции резервного копирования и восстановления или отключения и подключения.

Статья целиком на microsoft.com«>Статья целиком на microsoft.com

 10   2017   sql   windows

Как установить msu-пакет через ГПО

В рамках обновления KB2998527 пришлось изучить вопрос установки msu-пакетов.

Решение нашлось простое:
1) Открываем нужную нам политику
2) Идем Конфигурация компьютера — Политики — Конфигурация Windows — Сценарии (Запуск/завершение)
3) Открываем Автозагрузка и создаем сценарий:
Имя сценария: wusa.exe
Параметры сценария: <путь>\Windows6.1-KB2998527-x64.msu /quiet /norestart

 10   2014   windows

Инвентаризация компьютеров средствами WMI и VBScript

Инвентаризация компьютеров при помощи данного скрипта поможет системному администратору решить следующие задачи в масштабе небольшой организации:

  • Подготовка отчета о количестве, размещении и составе системных блоков для бухгалтерии. Информацию о других основных средствах (мониторах, ИБП, принтерах и т. п.) придется собирать другими способами.
  • Отслеживание изменений в конфигурации компьютеров, в том числе — выявление случаев самовольной замены комплектующих.
  • Поиск, отбор и подсчет компьютеров с заданными характеристиками при планировании закупок или при решении каких-либо технических вопросов.

Возможности и особенности

Предлагаемый скрипт позволяет:

  • Собирать сведения о конфигурации множества компьютеров тремя разными способами — локально (если нет доступа по сети), удаленно (с рабочего места администратора), через logon-скрипт.
  • Сохранять отчеты о конфигурации компьютера в структурированный текстовый файл формата CSV, удобный для последующей автоматизированной обработки.
  • Создавать настраиваемый общий отчет по всем имеющимся компьютерам.

Отличительные особенности скрипта:

  • Используются встроенные в Windows 2000/XP/2003/Vista компоненты VBScript и WMI. Установка и лицензирование дополнительных программ не требуется.
  • В программном коде можно настроить состав и структуру отчета под свои нужды. При желании не трудно добавить вывод отчетов в других текстовых форматах (TXT, INI, HTML, XML), удобных для просмотра, печати или импорта в других программах.
  • Собираются и выводятся в отчет только действительно нужные для решения поставленных задач сведения. Скрипт не предназначен для сбора исчерпывающей информации о составе системного блока.

Загрузка и установка

Скрипт для инвентаризации компьютеров средствами WMI и VBScript, упакован ZIP: invent_comp.zip

Установка не требуется, достаточно распаковать архив в отдельный каталог на рабочей станции администратора.

Первый этап работы — сбор данных

Скрипт invent_comp.vbs собирает данные о конфигурации указанного компьютера и сохраняет отчет в формате CSV в заданный локальный каталог или на сетевой ресурс. Имя файла отчета соответствует сетевому имени компьютера. Есть несколько вариантов запуска.

Вариант 1 — для тестирования или для отдельных сетевых компьютеров и серверов

Для проверки скрипта при первом знакомстве, а также для сбора данных с серверов и отдельных компьютеров не дожидаясь их перезагрузки, можно запускать скрипт вручную, с рабочего места администратора. При этом достаточно использовать настройки по умолчанию, тогда отчеты будут сохраняться в подкаталог рядом со скриптом:

Const SILENT = FALSE 'тихий режим отключен, будет запрошено имя компьютера
Const DATA_DIR = "comp\" 'локальный каталог + "\" в конце

Вариант 2 — для сетевых рабочих станций

Скрипт может работать в «тихом» режиме, т. е. не выводить диалоги, собирать данные о локальном компьютере и сохранять отчет на заранее определенный сетевой ресурс. Таким образом возможен автоматический запуск на всех рабочих станциях сети, например при их включении. Для этого варианта запуска лучше создать и использовать отдельную копию файла.

Сначала необходимо выделить сетевой ресурс для сохранения отчетов и дать разрешение на запись пользователю (или группе пользователей), от имени которого будет запускаться скрипт.

Настройки в самом скрипте такие:

Const SILENT = TRUE 'режим отчета о локальном компьютере, без вывода диалогов
Const DATA_DIR = "\\SRV\Invent\comp\" 'сетевой ресурс + "\" в конце

Затем следует настроить запуск скрипта через logon-скрипт или групповую политику. Необходимо учитывать, что для обращения к компоненту WMI нужны права администратора — поэтому в групповой политике лучше включать скрипт в конфигурацию компьютера, а не пользователя.

Вариант 3 — для компьютеров, не подключенных к сети

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

Формат отчета с результатами
Результаты сохраняются в текстовый файл формата CSV. Каждая строка файла состоит из 4 полей, разделенных символом ; («точка с запятой»):

  • Тип компонента — используется для группировки
  • Название параметра
  • Номер экземпляра (целое число) — нужен для различения нескольких компонентов одного типа
  • Значение параметра

Если в значении какого-либо параметра встретится символ ;, он будет заменен на символ _. Значения полей не заключаются в кавычки. Первая строка содержит заголовки столбцов. При желании можно отключить добавление этой строки в настройках:

Const HEAD_LINE = False 'НЕ выводить заголовки в первой строке CSV-файла

Пример отчета:

Секция отчета;Параметр;Номер экземпляра;Значение
Компьютер;Дата проверки;1;10.06.2009 22:33:44
Компьютер;UUID;1;67DB3380-FEB7-11D5-8ED2-001E8CAD784C
Компьютер;Сетевое имя;1;COMP
Компьютер;Домен;1;WORKGROUP
Компьютер;Владелец;1;User
Компьютер;Текущий пользователь;1;COMP\Pavel
Компьютер;Объем памяти (Мб);1;2047
Операционная система;Наименование;1;Microsoft Windows XP Professional
Операционная система;Версия;1;5.1.2600
Операционная система;Обновление;1;Service Pack 3
Операционная система;Зарегистрированный пользователь;1;User
Операционная система;Серийный номер;1;XXXXX-XXX-XXXXXXX-XXXXX
Операционная система;Организация;1;1
Операционная система;Дата установки;1;06.08.2008 12:34:56
Материнская плата;Производитель;1;ASUSTeK Computer INC.
Материнская плата;Наименование;1;P5KPL-VM
Материнская плата;Версия;1;x.xx
Материнская плата;Серийный номер;1;MT7082K06808353
BIOS;Производитель;1;American Megatrends Inc.
BIOS;Наименование;1;BIOS Date: 07/28/08 14:07:15 Ver: 08.00.12
BIOS;Версия;1;0904
BIOS;Серийный номер;1;System Serial Number
Процессор;Наименование;1;Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz
Процессор;Описание;1;x86 Family 6 Model 23 Stepping 6
Процессор;Частота (МГц);1;2664
Процессор;Частота FSB (МГц);1;333
Процессор;Размер L2-кеша (кб);1;6144
Процессор;Разъем;1;Socket 775
Модуль памяти;Размер (Мб);1;1024
Модуль памяти;Частота;1;800
Модуль памяти;Размещение;1;DIMM A1
Модуль памяти;Размер (Мб);2;1024
Модуль памяти;Частота;2;800
Модуль памяти;Размещение;2;DIMM B1
Диск;Наименование;1;WDC WD3200AAKS-00C9A0
Диск;Размер (Гб);1;298
Диск;Интерфейс;1;IDE
Логический диск;Наименование;1;C:
Логический диск;Файловая система;1;NTFS
Логический диск;Размер (Гб);1;32
Логический диск;Свободно (Гб);1;14
Логический диск;Серийный номер;1;8C959CAC
CD-привод;Наименование;1;Optiarc DVD RW AD-5200A

Второй этап работы — составление общего отчета

Полученные на первом этапе отчеты можно не только просматривать по-отдельности, но и свести в одну таблицу. Скрипт invent_comp_report.vbs просматривает заданный каталог и из всех найденных там отчетов извлекает данные.

Перед запуском надо проверить настройки в тексте скрипта:

Const DATA_DIR = "comp\" 'каталог для сохранения отчетов + "\" в конце
Const DATA_EXT = ".csv" 'расширение файлов с данными
Const HEAD_LINE = True 'пропустить первую строку в файле CSV - заголовок
Const REPORT_FILE = "comp_report_%DATE%.htm" 'файл для сохранения отчета

Не все данные из отдельного отчета нужны в общем отчете. Какие столбцы и в каком порядке попадут в общий отчет определяется в программном коде через массив:

'количество, порядок и названия столбцов отчета
'значения должны соответствовать первым двум полям CSV файла!
Dim col(21) '

После запуска скрипта invent_comp_report.vbs будет создан файл в формате XHTML, который можно открыть в браузере, импортировать в OpenOffice.org Calc или Microsoft Excel (не проверено).

В таблице каждому компьютеру соответствует одна строка. Если на компьютере есть несколько комплектующих одного типа, то они оформляются в виде списка.

Для дополнительной обработки табличного отчета и вывода на печать предлагается использовать специально предназначенные для этого программы, например, OpenOffice.org Calc.

Тонкая настройка скрипта

Добавление и удаление параметров

Какие параметры и в каком порядке попадут в отчет определяется в программном коде процедуры InventComp. Каждой секции отчета, содержащей сведения по всем экземплярам какого-либо класса компонентов, соответствует один вызов подпрограммы Log. Вот пример:

Log "Win32_ComputerSystem", _
  "Name,Domain,PrimaryOwnerName,UserName,TotalPhysicalMemory", "", _
  "Компьютер", _
  "Сетевое имя,Домен,Владелец,Текущий пользователь,Объем памяти (Мб)"

Параметры вызова подпрограммы разнесены на несколько строк для наглядности. Третий параметр чаще всего — пустая строка, и поэтому расположен на одной строке со вторым.

Пояснение к параметрам данного вызова подпрограммы:

  • «Win32_ComputerSystem» — класс WMI, к которому идет запрос
  • «Name,Domain,PrimaryOwnerName... — свойства WMI (через запятую), значения которых надо включить в отчет
  • »» — условие отбора по правилам WQL (подробности далее), или пустая строка.
  • «Компьютер» — название соответствующей секции отчета, выводится в первом столбще CSV-файла.
  • «Сетевое имя,Домен,Владелец... — названия параметров (через запятую), соответствующих перечисленным выше свойствам WMI, в том же порядке и количестве, выводится во втором столбце CSV-файла.

Чтобы корректно добавить или изменить подобный вызов, необходимо найти и изучить документацию по соответствующему WMI-классу:

Также для составления и тестирования запросов к WMI можно использовать программы:

  • Microsoft WMI Object Browser — работает через web-интерфейс, входит в состав «WMI Administrative Tools»
  • WMI Explorer — не требует установки, автор Alexander Kozlov

Удаление ненужных значений

Чтобы в отчет не попадали отключенные сетевые адаптеры, минипорты и виртуальные адаптеры VMware, в запросе к классу Win32_NetworkAdapter добавлено условие:

"NetConnectionStatus > 0 AND NOT (Name LIKE 'VMware%')"

Чтобы в отчет попадали только локальные принтеры, подключенные через порт USB или LPT, в запросе к классу Win32_Printer добавлено условие:

"(Local = True OR Network = False) AND (PortName LIKE '%USB%' OR PortName LIKE '%LPT%')"

Чтобы в секцию отчета «Диск» попадали данные только о жестких дисках, в запросе к классу Win32_DiskDrive добавлено условие:

"InterfaceType <> 'USB'"

Соответственно, чтобы в секцию отчета «Логический диск» также попадали данные только о разделах жестких дисков, в запросе к классу Win32_LogicalDisk добавлено условие:

'DriveType = 3 - только локальные диски
'пропускаются USB-диски, размер которых обычно NULL
"DriveType = 3 AND Size IS NOT NULL"

В Windows 2000 компонент WMI не поддерживает некоторые WMI-классы, например сетевые адаптеры и принтеры. Причем, если все-таки отправить некорректный запрос, не вернется ни ответа, ни сообщения об ошибке — создание отчета просто прекратится. Поэтому добавлена проверка версии WMI-сервера — запрос выполняется только если номер сборки операционной системы больше или равен 2600 (Windows XP/2003):

If build >= 2600 Then
  Log "Win32_NetworkAdapter", _
If build >= 2600 Then
  Log "Win32_Printer", _

Видеоадаптеры ATI, имеющие два выхода отображаются как два отдельных адаптера, причем в названии второго есть слово «Secondary». Чтобы в отчете не отображались такие «двойники», в запросе к классу Win32_VideoController добавлено условие:

"NOT (Name LIKE '%Secondary')"

Формат значений

Размер дисков и объем памяти в WMI выдается в байтах. Чтобы в отчете значения какого-либо параметра выводились в более привычных кратных единицах, достаточно в конце названия параметра добавить условные символы (Мб) или (Гб). В скрипте есть проверка этих условных символов:

'если указана кратная единица измерения, перевести значение
ElseIf Right(names(i), 4) = "(Мб)" Then
  value = CStr(Round(value / 1024 ^ 2))
ElseIf Right(names(i), 4) = "(Гб)" Then
  value = CStr(Round(value / 1024 ^ 3))

Значения, имеющие тип «дата и время» распознаются по свойству CIMType и автоматически преобразуются в читаемый вид:

'если тип данных - дата, преобразовать в читаемый вид
ElseIf prop.CIMType = 101 Then
  value = ReadableDate(value)

Если значение является массивом (например, перечень поддерживаемых форматов бумаги у принтера — свойство PrinterPaperNames класса Win32_Printer), то все значения автоматически «склеиваются» в строку с запятой в качестве разделителя:

'если тип данных - массив, собрать в строку
ElseIf IsArray(value) Then
  value = Join(value,",")

Возможные проблемы и способы их устранения

При тестировании скрипта замечены такие ошибки:

Проблема Вероятная причина Как устранить
Сообщение «Компьютер удаленного сервера не существует или недоступен» Доступ к службе WMI удаленного компьютера заблокирован брандмауэром. Отключить службу брандмауэра, подключившись к удаленному компьютеру через консоль (оснастку) «Управление компьютером».
Сообщение «Разрешение отклонено» Не удается создать новый или обновить существующий файл отчета. Проверить, что в настройках скрипта указан нужный каталог для сохранения отчетов, файл отчета не занят другой программой и для него не установлен атрибут «только чтение», у скрипта достаточно разрешений на запись.
Сообщение «Объект не поддерживает это свойство или метод» Некоторые свойства объектов WMI не поддерживаются Windows 2000. При обращении к таким свойствам возникает ошибка. Например, при подключении к Windows 2000 такую ошибку вызывает обращение к свойствам ’NetConnectionStatus’, ’AdapterType’ элемента коллекции ’Win32_NetworkAdapter’. Проверить в документации по WMI, какие свойства не поддерживаются в некоторых ОС и перед обращением к таким свойствам проверять версию ОС или вообще их не использовать.
Неправильно определяется процессор Intel Core 2 в XP Это неточность компонента WMI, см. статью Microsoft на эту тему. Цитата: `The data that is returned indicates that the CPU name is «Intel Pentium III Xeon» or «Intel Pentium III.» However, System Properties or System Information (MSInfo32.exe) shows the name as «Intel(R) Core(TM)2 Duo CPU E8000»`. В упомянутой статье есть ссылка для загрузки исправления.
Неправильно определяется процессор Intel Celeron в XP Это неточность компонента WMI, см. статью Microsoft на эту тему. В упомянутой статье есть ссылка для загрузки исправления.
Не появляется окно «Отчет сохранен в файл», создание отчета останавливается Отправлен некорректный WMI-запрос — допущена синтаксическая ошибка или запрошенное свойство не поддерживается. Найти, исправить или отключить некорректный WMI-запрос.

(c) http://zheleznov.info

 67   2014   windows

Что делать, если БД в состоянии Suspend?

Случилось, что после вынужденного выключения сервера БД одна из баз свалилась в состояние Suspend. Конечно лучше делать бекапы, но не было их на тестовом сервере. Вот скрипт, который можно и в GUI проделать, который мне помог восстановить базу:

EXEC sp_resetstatus [DB];
ALTER DATABASE [DB]SET EMERGENCY
DBCC checkdb([DB])
ALTER DATABASE [DB]SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([DB], REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [DB]SET MULTI_USER

Вместо [DB] вставить свою БД.

 7   2014   sql   windows

Утилизация RAM Metafile в Windows 2008 R2

Как часто вы видели в Диспетчере задач (Task Manager) 100% загрузку RAM, хотя суммарно по процессам там было не более 30%?
На скриншотах ниже показана не 100% загрузка, но ощутить неприятный момент дадут.

Хорошо, что у нас уже есть инструменты Windows Sysinternals, а конкретно RAMMap. Качаем, запускаем (не требует установки) и видим следующую картину:

Некие Metafiles отъедают львиную долю оперативки и, если посчитать, именно этот объем мы не увидим в Диспетчере задач.
Погуглив на тему Metafiles я нашел описание:

Metafile is part of the system cache and consists of NTFS metadata. NTFS metadata includes the MFT as well as the other various NTFS metadata files… In the MFT each file attribute record takes 1KB and each file has at least one attribute record. Add to this the other NTFS metadata files and you can see why the Metafile category can grow quite large on servers with lots of files

Что же, основным содержание одного из дисков являются jpg-файлы (>1.8Tb). Поиск по фразам «how to clean / reduce METAfIle size» выдал решение в виде установки Dynamic Cache Service. В первый раз я не установил данную службу, поэтому не могу сказать при ее работоспособность, но говорят, что под Windows Server 2008 R2 Web edition она не работает.
Что же делать, если нужно срочно освободить RAM или служба Dynamic Cache Service не приводит к желаемому результату? Открываем RAMMap, меню Empty — Empty System Wokring Set

После этого вы увидите пропавшие гигабайты.

 7   2014   windows

Поиск цепочек блокировок на SQL Server с помощью процедуры sp_locks

Введение

Параллелизм в отношении БД можно определить как число пользователей, способных работать с данной БД, не мешая и не пересекаясь друг с другом. Чем больше число одновременно работающих пользователей, тем выше параллелизм.

SQL Server блокирует данные для обеспечения их целостности. Это необходимо в любой БД, где данные подвергаются изменениям. Чтобы подчеркнуть это, скажу, что если БД находится в состоянии READ_ONLY, SQL Server не создает блокировок считываемых данных, поскольку они не могут быть изменены и, следовательно, защищать данные не нужно. Поэтому SQL Server только помечает объекты, к которым происходит обращение, блокировкой Intense Share (IS), чтобы исключить выполнение таких DDL-выражений, как удаление таблицы, из которой производится чтение.

Блокировки данных существуют в любой среде, где модифицируются данные (то есть БД находится в состоянии READ_WRITE, в противоположность предыдущему примеру), и это совершенно нормально. SQL Server удерживает необходимые блокировки для защиты целостности данных и освобождает данные, как только отпадает необходимость в блокировке.

Краткосрочные блокировки не оказывают негативного воздействия, они — часть нормальной работы SQL Ser­ver. Проблемы возникают, когда продолжительность блокировок становится большой, то есть в несколько секунд, и в этом случае в игру вступает sp_locks.

sp_locks

sp_locks — это полезное средство, помогающее в поиске и устранении проблем в сценариях с блокировками и параллелизмом.

Листинг 1. Процедура sp_locks.

USE [master];
SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON;

IF  EXISTS (SELECT * FROM sys.objects 
              WHERE object_id = OBJECT_ID(N'[dbo].[sp_Locks]') 
                AND type IN (N'P', N'PC')
)
  DROP PROCEDURE dbo.sp_Locks;
GO
  
  
CREATE PROCEDURE dbo.sp_Locks
(
   @Mode int = 2,
   @Wait_Duration_ms int = 1000 /* 1 seconds */
)
/*
  19/04/2008 Yaniv Etrogi
  http://www.sqlserverutilities.com  
*/
AS
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

--EXEC sp_Locks @Mode = 3, @Wait_Duration_ms = 1000

/* return the one result set */
IF @Mode = 1
BEGIN;
  SELECT
      t.blocking_session_id           AS blocking,
      t.session_id                    AS blocked,
      p2.[program_name]               AS program_blocking,
      p1.[program_name]               AS program_blocked,
      DB_NAME(l.resource_database_id) AS [database],
      p2.[hostname]                   AS host_blocking,
      p1.[hostname]                   AS host_blocked,
      t.wait_duration_ms,
      l.request_mode,
      l.resource_type,
      t.wait_type,
      (SELECT SUBSTRING(st.text, (r.statement_start_offset/2) + 1, 
              ((CASE r.statement_end_offset 
                  WHEN -1 THEN DATALENGTH(st.text) 
                  ELSE r.statement_end_offset END
                - r.statement_start_offset) /2 ) + 1)
        FROM sys.dm_exec_requests AS r 
          CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st 
        WHERE r.session_id = l.request_session_id) AS statement_blocked,
      CASE WHEN t.blocking_session_id &gt; 0 THEN 
        (SELECT st.text 
          FROM sys.sysprocesses AS p 
            CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) AS st
          WHERE p.spid = t.blocking_session_id)
      ELSE NULL END AS statement_blocking
       --,t.resource_description AS blocking_resource_description
       --,l.resource_associated_entity_id
    FROM sys.dm_os_waiting_tasks AS t
      INNER JOIN sys.dm_tran_locks AS l 
        ON t.resource_address = l.lock_owner_address
      INNER JOIN sys.sysprocesses p1 ON p1.spid = t.session_id
      INNER JOIN sys.sysprocesses p2 ON p2.spid = t.blocking_session_id
    WHERE t.session_id &gt; 50 AND t.wait_duration_ms &gt; @Wait_Duration_ms;
END;

/* return the first two result sets */
IF @Mode = 2
BEGIN;
SELECT 
    spid,
    [status],
    CONVERT(CHAR(3), blocked) AS blocked,
    loginame,
    SUBSTRING([program_name] ,1,25) AS program,
    SUBSTRING(DB_NAME(p.dbid),1,10) AS [database],
    SUBSTRING(hostname, 1, 12) AS host,
    cmd,
    waittype,
    t.[text]
  FROM sys.sysprocesses p
    CROSS APPLY sys.dm_exec_sql_text (p.sql_handle) t
  WHERE spid IN (SELECT blocked FROM sys.sysprocesses WHERE blocked &lt;&gt; 0) 
    AND blocked = 0;

SELECT
    t.blocking_session_id            AS blocking,
    t.session_id                     AS blocked,
    p2.[program_name]                AS program_blocking,
    p1.[program_name]                AS program_blocked,
    DB_NAME(l.resource_database_id)  AS [database],
    p2.[hostname]                    AS host_blocking,
    p1.[hostname]                    AS host_blocked,
    t.wait_duration_ms,
    l.request_mode,
    l.resource_type,
    t.wait_type,
    (SELECT SUBSTRING(st.text, (r.statement_start_offset / 2) + 1, 
              ((CASE r.statement_end_offset 
                  WHEN -1 THEN DATALENGTH(st.text)
                  ELSE r.statement_end_offset END
                - r.statement_start_offset) / 2) + 1
            )
      FROM sys.dm_exec_requests AS r
        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st 
      WHERE r.session_id = l.request_session_id) AS statement_blocked,
    CASE WHEN t.blocking_session_id &gt; 0 THEN 
          (SELECT st.text 
            FROM sys.sysprocesses AS p 
              CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) AS st 
            WHERE p.spid = t.blocking_session_id) ELSE NULL 
         END AS statement_blocking
  FROM sys.dm_os_waiting_tasks AS t
    INNER JOIN sys.dm_tran_locks AS l
      ON t.resource_address = l.lock_owner_address
    INNER JOIN sys.sysprocesses p1 ON p1.spid = t.session_id
    INNER JOIN sys.sysprocesses p2 ON p2.spid = t.blocking_session_id
  WHERE t.session_id &gt; 50 AND t.wait_duration_ms &gt; @Wait_Duration_ms;
END;


/* return all three result sets */
IF @Mode = 3
BEGIN;
SELECT 
    spid,
    [status],
    CONVERT(CHAR(3), blocked) AS blocked,
    loginame,
    SUBSTRING([program_name], 1, 25)   AS program,
    SUBSTRING(DB_NAME(p.dbid), 1, 10)  AS [database],
    SUBSTRING(hostname, 1, 12)         AS host,
    cmd,
    waittype,
    t.[text]
  FROM sys.sysprocesses p
  CROSS APPLY sys.dm_exec_sql_text (p.sql_handle) t
  WHERE spid IN (SELECT blocked FROM sys.sysprocesses WHERE blocked &lt;&gt; 0)
    AND blocked = 0;

  
SELECT
    t.blocking_session_id                AS blocking,
    t.session_id                        AS blocked,
    SUBSTRING(p2.[program_name], 1, 25)  AS program_blocking,
    SUBSTRING(p1.[program_name], 1, 25)  AS program_blocked,
    DB_NAME(l.resource_database_id)      AS [database],
    p2.[hostname]                        AS host_blocking,
    p1.[hostname]                        AS host_blocked,
    t.wait_duration_ms,
    l.request_mode,
    l.resource_type,
    t.wait_type,
    (SELECT SUBSTRING(st.text, (r.statement_start_offset/2) + 1, 
            ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
              ELSE r.statement_end_offset 
              END - r.statement_start_offset) / 2) + 1) 
      FROM sys.dm_exec_requests AS r 
        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st 
      WHERE r.session_id = l.request_session_id) AS statement_blocked,
    CASE WHEN t.blocking_session_id &gt; 0 THEN 
           (SELECT st.text 
              FROM sys.sysprocesses AS p 
                CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) AS st 
              WHERE p.spid = t.blocking_session_id) ELSE NULL 
         END AS statement_blocking
    --,t.resource_description        AS blocking_resource_description
    --,l.resource_associated_entity_id
  FROM sys.dm_os_waiting_tasks AS t
    INNER JOIN sys.dm_tran_locks AS l 
      ON t.resource_address = l.lock_owner_address
    INNER JOIN sys.sysprocesses p1 ON p1.spid = t.session_id
    INNER JOIN sys.sysprocesses p2 ON p2.spid = t.blocking_session_id
  WHERE t.session_id &gt; 50 AND t.wait_duration_ms &gt; @Wait_Duration_ms;

SELECT DISTINCT
    r.session_id             AS spid,
    r.percent_complete       AS [percent],
    r.open_transaction_count AS open_trans,
    r.[status],
    r.reads,
    r.logical_reads,
    r.writes,
    s.cpu,
    DB_NAME(r.database_id)   AS [db_name],
    s.[hostname],
    s.[program_name],
  --s.loginame,
  --s.login_time,
    r.start_time,
  --r.wait_type,
    r.wait_time,
    r.last_wait_type,
    r.blocking_session_id    AS blocking,
    r.command,
    (SELECT SUBSTRING(text, statement_start_offset / 2 + 1,
            (CASE WHEN statement_end_offset = -1 THEN
                    LEN(CONVERT(NVARCHAR(MAX),text)) * 2 
                  ELSE statement_end_offset 
                  END - statement_start_offset) / 2)
      FROM sys.dm_exec_sql_text(r.sql_handle)) AS [statement],
    t.[text]
    --,query_plan 
  FROM sys.dm_exec_requests r
    INNER JOIN sys.sysprocesses s ON s.spid = r.session_id
    CROSS APPLY sys.dm_exec_sql_text (r.sql_handle) t
    --CROSS APPLY sys.dm_exec_query_plan (r.plan_handle) 
  WHERE r.session_id &gt; 50 AND r.session_id &lt;&gt; @@spid
    AND s.[program_name] NOT LIKE 'SQL Server Profiler%'
    --AND db_name(r.database_id) NOT LIKE N'distribution'
    --AND r.wait_type IN ('SQLTRACE_LOCK', 'IO_COMPLETION', 'TRACEWRITE')
  ORDER BY s.CPU DESC;
END;
GO

В отличие от хранимой процедуры sp_helpindex2, выбирающей информацию, связанную с контекстом текущей БД, sp_locks выбирает информацию уровня сервера, и поэтому она не должна быть помечена как системная хранимая процедура. Однако использование префикса sp_ позволяется воспользоваться тем, что SQL Server сперва ищет все объекты с таким префиксом в БД master. Это дает возможность вызвать процедуру из любой БД, не используя имя из трех частей (например, database.schema.object), что удобно.

Процедура возвращает до трех наборов результатов, что регулируется входным параметром @Mode.

Первый набор результатов возвращает информацию о Lead Blocker-процессе, если таковой существует, и нужен в ситуациях наличия высокой активности блокировок, приводящей к появлению цепочек блокировок.

Цепочка блокировок — это ситуация, когда есть много процессов, блокирующих другие процессы, которые, в свою очередь, блокируют данные или другие процессы. Во многих случаях это требует ручного вмешательства для разрешения конфликта, обычно это вмешательство принимает форму команды, завершающей исполнение процесса, выступающего в роли Lead Blocker.

Lead Blocker — это кличка для процесса, являющегося главной причиной, инициатором, с которого начинается цепочка блокировок — то есть этот процесс блокирует другой процесс, который, в свою очередь, будучи заблокированным, не может снять наложенные им блокировки, и тем самым сам становится блокирующим процессом. Это может продолжаться и продолжаться, вовлекая другие процессы, и порождая цепочки блокировок.

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

Этот набор результатов чаще всего содержит одну строку, но в сценарии эскалации блокировок вы можете увидеть и несколько строк (что означает, что имеется несколько блокирующих процессов и несколько цепочек блокировок).

На рисунке 1, где показано исполнение тестового сценария, блокирующим является процесс, выдавший команду UPDATE (spid 218). Этот процесс блокирует первый процесс, (spid 193), выдающий команду SELECT (/* connection 1 */), и любой последующий SELECT блокируется этим первым выражением SELECT.

Завершение подключения, выдавшего команду UPDATE, позволит всем блокированным (ожидающим) процессам продолжить работу и разрушит цепочку блокировок.

Заметьте, что если прервать любой другой процесс, сценарий эскалации блокировок не будет прерван и цепочка блокировок сохранится.

Второй набор результатов содержит информацию о блокирующих и блокированных процессах, обращаясь к трем ключевым DMV: sys.dm_os_waiting_tasks, sys.dm_­tran_locks и sys.sysprocesses.

Мы выполняем запрос sys.dm_os_waiting_tasks, поскольку именно это нас и интересует — задачи (процессы), находящиеся в состоянии ожидания, в данном случае — ожидающие возможности получить блокировку ресурсов. Приятно то, что это DMV можно соединить с sys.dm_tran_locks по колонке resource_address, которая содержит адрес в памяти ресурса, которого ожидает задача, а с другой стороны условия объединения имеется колонка lock_owner_address из sys.dm_tran_locks, являющаяся адресом в памяти внутренней структуры данных, используемой для отслеживания запросов на блокировки модулем LOCK_MANAGER SQL Server-а.

Эти два DMV дают ценную информацию о блокировках. Далее мы добавляем sys.sysprocesses, чтобы получить информацию более высокого уровня, о блокировках программ и хостов. Чтобы получить информацию о блокирующих и заблокированных процессах, мы дважды выполняем соединение с sys.sysprocesses — один экземпляр для блокирующих, а другой — для заблокированных процессов.

Это достигается соединением одного экземпляра sys.sysprocesses как p1 с sys.dm_os_waiting_tasks по колонке session_id, и второго экземпляра как p2 по колонке blocking_session_id из sys.dm_os_waiting_tasks.

Входной параметр @Wait_Duration_ms позволяет ограничить число выводимых строк теми процессами, чье время ожидание превышает число (время в миллисекундах), указанное в этом параметре. Это очень полезно, поскольку обычно вас не интересуют краткосрочные (в 2-3 секунды) ожидания (блокировки), не оказывающие отрицательного влияния на систему.

Третий набор результатов содержит информацию из sys.dm_exec_requests об активно исполняемых процессах. Этот набор результатов может быть полезным, когда нет активных блокировок, и первые два набора не содержат никаких строк, но вам все-таки нужно увидеть, что исполняется в данное время на сервере.

Листинг 2. Использование sp_lock

-- Возвратить только второй набор результатов
EXEC sp_Locks @Mode = 1, @Wait_Duration_ms = 1000;
-- Возвратить первый и второй наборы результатов
EXEC sp_Locks @Mode = 2, @Wait_Duration_ms = 1000;
-- Возвратить все три набора результатов
EXEC sp_Locks @Mode = 3, @Wait_Duration_ms = 1000;

Помещение информации о блокировках в таблицу

Чтобы сохранить информацию о блокировках в таблицу, используйте скрипт Capture_blocking_info.sql, который использует выражение INSERT…EXEC с sp_locks в @Mode = 2.

Листинг 3. Скрипт Capture_blocking_info.sql

/*

  Сохранение информации о блокировках в таблицу
  
  19/04/2008 Yaniv Etrogi   
  http://www.sqlserverutilities.com  

*/    
USE [tempdb];
SET ANSI_NULLS ON; SET QUOTED_IDENTIFIER ON;


IF  EXISTS (
  SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[dbo].[Blocks]') 
    AND type in (N'U'))
  DROP TABLE [dbo].[Blocks];
GO

CREATE TABLE [dbo].[Blocks](
  [Id] [int] identity(1,1) NOT NULL CONSTRAINT 
  [PK_Blocks] PRIMARY KEY NONCLUSTERED ([Id]),
  [InsertTime] datetime CONSTRAINT 
  [DF_Blocks_InsertTime] DEFAULT (getdate()) NOT NULL,
  [blocking] smallint NULL,
  [blocked] smallint NULL,
  [program_blocking] varchar(128) NULL,
  [program_blocked] varchar(128) NULL,
  [database] varchar(128) NULL,
  [host_blocking] varchar(128) NOT NULL,
  [host_blocked] varchar(128) NOT NULL,
  [wait_duration_ms] bigint NULL,
  [request_mode] varchar(60) NOT NULL,
  [resource_type] varchar(60) NOT NULL,
  [wait_type] varchar(60) NULL,
  [statement_blocked] varchar(max) NULL,
  [statement_blocking] varchar(max) NULL );
GO

CREATE CLUSTERED INDEX IXC_Blocks_InsertTime ON dbo.Blocks (InsertTime);

-- Бесконечный цикл до ручного прекращения исполнения 
-- или изменения условия WHEN
SET NOCOUNT ON;
DECLARE @i int; SELECT @i = 0;

WHILE (@i &lt; 1000000)
BEGIN;
INSERT INTO [dbo].[Blocks]
           ([blocking],
            [blocked],
            [program_blocking],
            [program_blocked],
            [database],
            [host_blocking],
            [host_blocked],
            [wait_duration_ms],
            [request_mode],
            [resource_type],
            [wait_type],
            [statement_blocked],
            [statement_blocking])
EXEC sp_Locks @Wait_Duration_ms = 1000, @Mode = 1;

SELECT @i = @i + 1;
IF @i % 100 = 0 PRINT @i;  --print every 100 iterations 
WAITFOR DELAY '00:00:10';  --10 seconds sleep
END;

-- Выборка полученных данных о блокировках.
SET NOCOUNT ON; 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT TOP 100
       [Id],
       [InsertTime], 
       [blocking],
       [blocked],
       LEFT([program_blocking], 20) AS [program_blocking],
       LEFT([program_blocked], 20)  AS [program_blocked],
       [database],
       [host_blocking],
       [host_blocked],
       [wait_duration_ms],
       [request_mode],
       [resource_type],
       [wait_type],
       [statement_blocked],
       [statement_blocking]
FROM  [dbo].[Blocks]
ORDER BY [InsertTime] DESC;

Внутри блокировок

Чтобы получить представление о блокирующих и заблокированных процессах, возвращаемых sp_locks, можно использовать следующий скрипт, детализирующий причины блокировки.

Я использую его при поиске и воспроизведении сценария блокировки. Фильтрация по spid позволяет мне видеть только нужные мне данные и получить картину выделенных ресурсов и состояния их блокировок.

SET NOCOUNT ON; 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
SELECT --TOP 100
  l.request_session_id AS spid,
  DB_NAME(l.resource_database_id) AS [database],
  CASE WHEN l.resource_type = 'OBJECT' 
    THEN OBJECT_NAME(l.resource_associated_entity_id, l.resource_database_id)
  WHEN l.resource_associated_entity_id = 0 
    THEN 'NA' 
    ELSE OBJECT_NAME(p.object_id, l.resource_database_id) END AS [object],
      p.index_id,
      l.resource_type        AS [resource],
      l.resource_description AS [description],
      l.request_mode         AS [mode],
      l.request_status       AS [status],
      l.resource_associated_entity_id
FROM sys.dm_tran_locks l 
LEFT JOIN sys.partitions p ON p.hobt_id = l.resource_associated_entity_id
WHERE resource_type NOT LIKE 'DATABASE'
--AND l.request_session_id = @@SPID -- &lt;---- edit spid here
--AND DB_NAME(l.resource_database_id) NOT LIKE 'distribution'

При исполнении скрипта для тестового сценария при фильтрации по имени БД я вижу все вовлеченные процессы. Это четко показывает, что блокирующий процесс, spid 218, удерживает эксклюзивную (Х) блокировку ключа индекса (кластерного индекса в данном случае), и что это блокировка обновляемой строки. Эксклюзивная блокировка строки должна быть также помечена на уровне страницы, что и делается с помощью Intense Exclusive (IX) блокировки. Можно видеть, что это страница 154 в файле данных с номером 1. IX-блокировка страницы должна быть распространена до уровня таблицы, что и делается с помощью IX-блокировки этого объекта.

Листинг 4. Тестовый сценарий

USE [master];
SET ANSI_NULLS ON; SET QUOTED_IDENTIFIER ON;

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'TEST')
  CREATE DATABASE TEST;
GO

USE [TEST];
IF EXISTS (
  SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[dbo].[T1]') 
    AND type in (N'U'))
  DROP TABLE [dbo].[T1];
GO

USE [TEST];
IF EXISTS (
  SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[dbo].[T1]') 
    AND type in (N'U'))
  DROP TABLE [dbo].[T1];
GO

CREATE TABLE [dbo].[T1]
(
  [c1] [int] IDENTITY(1,1) NOT NULL,
  [c2] [int] NOT NULL, PRIMARY KEY CLUSTERED([c1] ) 
);


INSERT T1 (c2) VALUES (10);
INSERT T1 (c2) VALUES (20);
INSERT T1 (c2) VALUES (30);
INSERT T1 (c2) VALUES (40);
INSERT T1 (c2) VALUES (50);
INSERT T1 (c2) VALUES (60);
/* Blocker */
-- Выполняет UPDATE и оставляет транзакцию открытой, так что эксклюзивная (X) 
-- блокировка, получаемая процессом, не освобождается. 
USE [TEST];
BEGIN TRAN; UPDATE T1 SET c2 = 100 WHERE c1 = 5;
--ROLLBACK

/* Blocked */
USE [TEST]; SELECT * FROM TEST..T1 /* connection 1 */ ;
USE [TEST]; SELECT * FROM TEST..T1 /* connection 2 */ ;
USE [TEST]; SELECT * FROM TEST..T1 /* connection 3 */ ;
USE [TEST]; SELECT * FROM TEST..T1 /* connection 4 */ ;
USE [TEST]; SELECT * FROM TEST..T1 /* connection 5 */ ;

Все остальные процессы, пытающиеся читать данные, имеют статус WAIT и ожидают освобождения ресурса, заблокированного выражением UPDATE.

Права

DMV (Dynamic Management Views) и DMF (Dynamic Management Function), используемые хранимой процедурой, требуют, чтобы вызывающая их сторона имела права VIEW SERVER STATE и, конечно, право на запуск процедур из БД master (EXECUTE).

/*
USE [master];
GRANT VIEW SERVER STATE TO Paul;
GRANT EXECUTE ON sp_locks TO Paul;
*/

(c) www.k-press.ru

 9   2014   sql   windows

Экспорт и импорт сайтов и пулов приложений из/в IIS

When using multiple IIS server in a Load Balanced Environment it will be alot of work to create all your website twice with the same settings on each webserver. Therefor it is possible to export and import your configuration from one webserver to the other. This will also be usefull when your upgrading from IIS 7 (Windows Server 2008) to IIS 7.5 (Windows Server 2008 R2).

When you create a website in IIS 7 or 7.5 a unique application pool will also be created and used by this website, that’s why you need to import these application pools first on the second webserver before importing the website(s).

To Export the Application Pools on IIS 7:

%windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml

This will export all the application pools on your webserver, therefor you need to edit the apppools.xml and remove the application that you do not need to import for example:

  • DefaultAppPool
  • Classic .NET AppPool
  • SecurityTokenServiceApplicationPool

And other apppools that already exist on the second webserver, appcmd doesn’t skip already existing apppools, it just quit’s and doesn’t import any.

To import the Application Pools:

%windir%\system32\inetsrv\appcmd add apppool /in < c:\apppools.xml

All the AppPools in the xml will be created on your second webserver.

To Export all your website:

%windir%\system32\inetsrv\appcmd list site /config /xml > c:\sites.xml

This will export all the websites on your webserver, therefor you need to edit the sites.xml and remove the websites that you do not need to import for example:

  • Default Website

And all other websites that already exist on the second webserver.

To Import the website:

%windir%\system32\inetsrv\appcmd add site /in < c:\sites.xml

It’s also possible to export a single website or application pool all you need to do is add the name of the Application Pool or Website to the command line:

To export/import a single application pool:

%windir%\system32\inetsrv\appcmd list apppool “MyAppPool” /config /xml > c:\myapppool.xml

Import:

%windir%\system32\inetsrv\appcmd add apppool /in < c:\myapppool.xml

To export/import a single website:

%windir%\system32\inetsrv\appcmd list site “MyWebsite” /config /xml > c:\mywebsite.xml

Import:

%windir%\system32\inetsrv\appcmd add site /in < c:\mywebsite.xml

(c) microsoftpro.nl

 15   2014   iis   web   windows

Что нужно не забыть при передаче роли PDC эмулятора

Проблема
Иногда возникает абсолютно жизненная ситуация — роли хозяина операций.
Сервер может переезжать на новую платформу, апгрейдится, или просто сломаться.
Здесь часто упускается довольно важная деталь- при передаче роли PDC эмулятора (чьей одной из многих забот является контроль точного времени в домене) автоматически не изменяется параметр реестра, отвечающий за эту настройку.
//(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Parameters\Type)

Сценарий
Таким образом, представим ситуацию- у Вас имеется один лес, один домен и два сервера, являющихся контроллерами домена.
Отказывает один из контроллеров (PDC), и эта роль вручную передается второму контроллеру.
Что произойдет в этом случае? Параметр реестра, объявляющий сервер надежным источником точного времени, не «переедет» на нового владельца, и синхронизация времени нарушится.
Исправление

  1. На «старом» PDC Emulator, выполните:
w32tm /config /syncfromflags:domhier /reliable:no /update

net stop w32time
net start w32time
  1. Передайте роль PDC Emulator на новый контроллер домена.
  2. На «новом» PDC Emulator, выполните:
w32tm /config /manualpeerlist:PEERS /syncfromflags:manual /reliable:yes /update

где PEERS будут серверами-источниками точного времени,параметр может принимать значение DNS имени либо IP адреса.
Если источников больше одного, между ними необходимо ввести пробел, и также не забудьте про кавычки: «time.domain.com time1.domain.com».

(c) social.technet.microsoft.com

 9   2014   ad   windows

Передача или принудительное назначение (захват) ролей FSMO другому контроллеру домена используя модуль AD-Powershell

Перемещение FSMO ролей с помощью AD PowerShell имеет следующие преимущества:

  • Не требуется подключение к будущим владельцам роли,
  • Только захват роли FSMO (если текущий владелец недоступен) потребует ввода дополнительных параметров, вы должны будете использовать дополнительный параметр -force,
  • Перенос или захват FSMO ролей не требует обязательного подключения к текущему или будущему владельцу роли.Вы можете выполнять камандлеты модуля AD-Powershell на клиенте Windows 7 или  рядовом сервере Windows Server 2008 R2 (с установленным пакетом RSAT).

Передача ролей другому владельцу осуществляется с помощью командлета Move-ADDirectoryServerOperationMasterRole

Перенос всех ролей:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole SchemaMaster,RIDMaster,InfrastructureMaster,DomainNamingMaster,PDCEmulator

Захват всех ролей:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole SchemaMaster,RIDMaster,InfrastructureMaster,DomainNamingMaster,PDCEmulator -Force

В примере имя целевого Контроллера Домена DC1:
Используем следующую команду для передачи всех ролей дркгому контроллеру домена:

Move-ADDirectoryServerOperationMasterRole -Identity "DC1" -OperationMasterRole SchemaMaster,RIDMaster,InfrastructureMaster,DomainNamingMaster,PDCEmulator

Используем следующую команду для захвата всех ролей другим контроллером домена:

Move-ADDirectoryServerOperationMasterRole -Identity "DC1" -OperationMasterRole SchemaMaster,RIDMaster,InfrastructureMaster,DomainNamingMaster,PDCEmulator -Force

Вместо ввода Имен FSMO, можно использованы Цифровые сокращения.

0 - PDCEmulator
1 - RIDMaster
2 - InfrastructureMaster
3 - SchemaMaster
4 - DomainNamingMaster

Передача всех ролей:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 0,1,2,3,4

Захват всех ролей:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 0,1,2,3,4 -Force

В примере имя целевого Контроллера Домена DC1:
Используем следующую команду для передачи всех ролей другому контроллеру домена:

Move-ADDirectoryServerOperationMasterRole -Identity "DC1" -OperationMasterRole 0,1,2,3,4

Используем следующую команду для захвата всех ролей другим контроллером домена:

Move-ADDirectoryServerOperationMasterRole -Identity "DC1" -OperationMasterRole 0,1,2,3,4 -Force

Передача или захват роли Domain Naming Master

Передача роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole DomainNamingMaster

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 4

Захват роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole DomainNamingMaster -Force

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 4 -Force

Передача или захват роли Schema Master

Передача роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole SchemaMaster

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 3

Захват роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole SchemaMaster -Force

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 3 -Force

Передача или захват роли Infrastructure Master

Передача роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole InfrastructureMaster

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 2

Захват роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole InfrastructureMaster -Force

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 2 -Force

Передача или захват роли RID Master

Передача роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole RIDMaster

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 1

Захват роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole RIDMaster -Force

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 1 -Force

Передача или захват роли PDC Emulator

Передача роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole PDCEmulator

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 0

Захват роли:

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole PDCEmulator -Force

или

Move-ADDirectoryServerOperationMasterRole -Identity "Target-DC" -OperationMasterRole 0 -Force

Дополнительная информация

Вы также можете просмотреть текущего владельца роли FSMO используя следующие командлеты AD-Powershell:

Get-ADForest | select SchemaMaster,DomainNamingMaster
Get-ADDomain | select PDCEmulator,RIDMaster,InfrastructureMaster

Ссылки

Move-ADDirectoryServerOperationMasterRole
Active Directory Administration with Windows PowerShell
How To Revert Back or downgrade Windows Server 2008 R2 Forest and Domain functional Level
AD-Powershell for Active Directory Administrators

(с) social.technet.microsoft.com

 10   2014   ad   windows
Ранее Ctrl + ↓