Если столкнулись с такой ошибкой (а она у меня возникла при установке одной из ролей на Windows Server 2019), то необходимо заглянуть в «C:\Windows\Logs\CBS\CBS.log» и найти эту ошибку в логе. Рядом с этой ошибкой должна найтись информация о конкретном файле обновления, который поврежден. В моем случае такой файл нашелся, но в нем не было указано к какому KB он относится.Package: Microsoft-Windows-Foundation-Package~31bf3856ad364e35~amd6410.0.17763.1, Identifier: Windows Foundation [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
Возможно я плохо искал, но мне помогло другое определить какая конкретно KB виновата. Я начал запускать стандартные команды в таких случаях: sfc /scannow
dism /online /cleanup-image /scanhealth
dism /online /cleanup-image /restorehealth
и одна из команд вывела сообщение, что системные файлы повреждены. После этого я снова заглянул в CBS.log и там уже фигурировали конкретные KB, на которые ругалась система.
Сначала система ругалась на обновление kb5017315. Я скачал его с сайта Microsoft. Это обновление не ставится, если попробовать установить его в лоб. Чтобы установить его принудительно, надо выполнить команды: expand -F:* "C:\путь\к\вашему\обновлению.msu" C:\temp\
dism /online /add-package /packagepath:"C:\temp\имяфайла.cab"
После этого я попытался заново поставить роль на ОС, но ошибка повторилась. В этот раз в логе CBS фигурировала другая KB, был такой текст Package_821_for_KB5027222~31bf3856ad364e35~amd6410.0.1.5.5027222-1596_neutral from file: (null) [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
Поэтому пришлось скачать еще одну KB и так же её распаковать и установить через cmd.
В моих проблемным обновлениях при распаковке оказывались два cab-файла. В первый раз я поставил тот, который больше по размеру. Во втором случае это не прокатило – после команды dism /online /add-package /packagepath:"C:\temp\имяфайла.cab" был вывод в консоль:Processing 1 of 1 - Adding package Multiple_Packages~~~~0.0.0.0
[== 5.0% ]
An error occurred - Error: 0x800f0986
и что смотрите файл с логами «C:\Windows\Logs\DISM\dism.log». В нем был такие строчкиFailed finalizing changes. - CDISMPackageManager::Internal_Finalize(hr:0x800f0986)
Failed processing package changes - CDISMPackageManager::ProcessChanges(hr:0x800f0986)
Loaded servicing stack for online use only. - CDISMPackageManager::CreateCbsSession.
В моем случае сервер не имеет выхода в интернет, что подтолкнуло меня к мысли, что устанавливаемому пакету «Windows10.0-KB5027222-x64.cab» в моем случае не хватает еще «SSU-17763.4121-x64.cab», который лежал рядом после распаковки MSU пакета обновления. Поэтому я еще раз запустил команду dism, только с указанием на пакет с обновление Service Stackdism /online /add-package /packagepath:"C:\temp\ SSU-17763.4121-x64.cab". Он установился и после этого еще раз запустил командуdism /online /add-package /packagepath:"C:\temp\Windows10.0-KB5027222-x64.cab" и он со второго раза установился.
После этого попытался выполнить установку роли на Windows Server и она прошла успешно. Перезагружать сервер не понадобилось.
Windows cannot find Microsoft Software License Terms
Если при in-place upgrade операционной системы Windows у вас возникла ошибка «Windows cannot find Microsoft Software License Terms» сразу после этапа выбора операционной системы. Проверьте файл C:\$Windows.~BT\Sources\Panther\setuperr.log (путь может отличаться) на наличие номера ошибки. В моем случае ошибка была с номером 0x060613. Мне помогло, то что нашел решение на сайте technet.microsoft.com, где посоветовали проверить политики безопасности а точнее политику «Manage auditing and security log» узкому кругу лиц, в группу которых не входила учетная запись, которая запускала установщик системы. Я поменял учетку на ту, что имеет более расширенные привилегии и установка прошла успешно.
«Произошла внутренняя ошибка подключения к удаленному рабочему столу» или «An internal error has occurred»
Привет!
Если после установки на сервер программного обеспечения «СКЗИ СКАД Сигнатура» или «ViPNet CSP» у вас возникает ошибка при подключении по RDP к этому серверу: «Произошла внутренняя ошибка подключения к удаленному рабочему столу» или «An internal error has occurred», значит эта заметка для вас. Чтобы исправить эту ошибку, нужно отключить соответствующие dll:
regsvr32 /u vdcng.dll — на сервере «СКЗИ СКАД Сигнатура»
regsvr32 /u Itccng.Dll — на сервере с «ViPNet CSP»
Конвертация диска из MBR в GPT (online, Windows)
Понадобилось сконвертировать диск более 2 Tb из MBR в GPT, на котором располагаются файловые шары.
Windows не хочет конвертировать такой диск на лету стандартными средствами оснастки управлениями дисками и утилитой diskpart, поэтому пришлось искать утилиту на стороне. Ею оказалась gptgen, которую можно скачать с SourceForge
Переносом данных при конвертировании онлайн заниматься не надо, что меня вполне устроило. И так план действий:
0. Делаем бекап диска, с которым будем проводить манипуляции (на всякий случай)
1. Запускаем в командной строке утилиту diskpart. Пишем команду list disk и смотрим какой номер диска, который нам нужен. Выходим из diskpart
2. Запускаем утилиту gptgen в командой строке. Она выдает список доступных ключей для запуска.
3. Запускаем команду gptgen -w \\.\physicaldriveX, где X-номер диска из пункта 1. Через несколько секунд появится сообщение, что все прошло успешно.
4. Перезагружаем сервер.
5. Проверяем, на месте ли все корневые папки на диске. В моем случае после конвертации все папки, которые были открыты на общий доступ, были отключены (зашарены). Пришлось их заново расшаривать. NTFS права на папки при этом не были затронуты.
6. Только после всех манипуляций я расширил диск в диспетчере дисков до размера превышающего 2 Tb. Все прошло успешно.
Удаленное изменение настроек SNMP в Windows используя скрипт
Привет! Появилась задача: необходимо на серверах с Windows Server 2003 и выше поменять настройки службы SNMP, добавив в настройки еще один IP-адрес, куда будут отсылаться SNMP-трапы и куда их вообще разрешено отсылать. Приведу два скриншота того, о чем я говорю:
Получается, на примере мне надо добавить к IP-адресу 192.168.1.1 еще один, например 192.168.1.2 в обе вкладки.
Проблемы были следующие: компьютеры не в домене; на компьютерах может быть разный локальный администратор и пароль.
Из плюсов: к большинству серверов имеется удаленный доступ к административной шаре admin$.
Был написан скрипт на powershell, который из файла на рабочем столе с именем servers.csv и содержащим список серверов, берет имя сервера и стандартными командами reg и sc очищает ветки реестра, в которых находятся нужные нам данные, и перезагружает службу SNMP. В случае проблем с подключением к серверу, выводится сообщение об ошибке. В процессе работы скрипта лишний вывод сообщений в окно терминала отключен.
Вот содержимое файла servers.csv для примера:

А вот содержимое самого скрипта:
chcp 1251 | Out-Null
cd ~/Desktop
$List = Import-Csv Servers.csv -Header Servers
Foreach ($s in $List) {
$Serv= $s.Servers
Write-Host "Подключение к серверу: " -foregroundcolor yellow -NoNewline
Write-Host $Serv -foregroundcolor green
reg delete \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /va /f
reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /v 1 /t REG_SZ /d 192.168.1.1 2>&1 | Out-Null
reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /v 2 /t REG_SZ /d 192.168.1.2 2>&1 | Out-Null
reg delete \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM /va /f 2>&1 | Out-Null
reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM /v 1 /t REG_SZ /d 192.168.1.1 2>&1 | Out-Null
reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM /v 2 /t REG_SZ /d 192.168.1.2 2>&1 | Out-Null
sc.exe \\$Serv stop SNMP 2>&1 | Out-Null
sc.exe \\$Serv start SNMP 2>&1 | Out-Null
}
Для того, чтобы скрипт запустить от имени локального администратора сервера нужно запустить командную строку и в ней выполнить команду:
runas /netonly /user:admin "powershell"
подразумевая, что на сервере есть пользователь admin с паролем. Если учетная запись не присутствует на сервере или пароль был введен не правильно, то при выполнении скрипта появится сообщение «Ошибка: Отказано в доступе». Если к серверу невозможно подключиться по причине его сетевой недоступности, то тогда ошибка будет «Ошибка: Не найден сетевой путь».

В случае успешного подключения появится сообщение «Операция успешно завершена«. Язык вывода сообщений конечно же зависит от установленного языка интерфейса в системе.

Uptime Windows Server
У кого больше? 🙂

Сбор статистики с принт-сервера на Windows.
В данный момент у меня есть сервер, к которому подключено более 400 принтеров и мне захотелось узнать сколько страниц ежедневно распечатывается. К сожалению, в сети большинстве своем есть только платные программы для сбора множества информации по серверу печати, поэтому решил для себя написать небольшой powershell-скрипт.
$date = get-date -format dd-MM-yyyy
$number = get-counter "\Очередь печати(_total)\Всего напечатано страниц" | Foreach-Object {$_.CounterSamples[0].CookedValue}
Convertto-html -title "Статистика печати" -PreContent "Количество распечатанных листов за $date : <b>$number</b>" >> C:\counter_print_pages.html
Всё, что он делает — это создает html файл в корне диска C:, в котором записывается информация из счетчика очереди печати со всех принтеров.
Чтобы этот скрипт выполнялся каждый день и заносил каждый раз новую информацию, нужно в «Планировщике задач» создать расписание, где в 23:59 будет выполняться данный выше кусок кода. Далее, чтобы статистика за день обнулилась, а также для того, чтобы на сервере печати очищались от заданий очереди на печать, в «Планировщик задач» добавить на выполнение в 0:00 еще один скрипт:
net stop "spooler"
del /S /Q c:\windows\system32\Spool\Printers\*
net start "spooler"
Таким образом файл со статистикой печати будет ежедневно пополняться актуальной информацией о количестве распечатанных страниц.
Настройка аудита запуска/остановки службы в Windows
Столкнулся с такой задачей: требовалось знать кто остановил критически важную службу на Windows-сервере. Как оказалось аудит этого события настраивается немного по-другому, в отличии, например, от файлового сервера. Что для этого требуется:
1) для начала скажу, что нельзя настроить аудит сразу всех служб — нужно выбрать конкретные службы для их аудита. Узнаем короткое имя службы, например, через команду PS get-service и в столбце «Name» оно будет отображено
2) в cmd выполняем команду sc sdshow [короткое имя службы]. Выведется строка примерно такого вида D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU). Скопируйте ее в блокнот и в конце добавьте строку S:(AU;SAFA;RPWPDT;;;WD). Буква «D» в начале строки означает начало списка доступа DACL, а буква «S» — список доступа SACL, который используется при логировании. Если выводимая строка в команде «sc sdshow» уже будет содержать SACL, то удаляем ее и добавляем ту, которая указана выше.
3) выполняем в cmd команду sc sdset [короткое имя службы][получившаяся новая строка]. После этого должна появиться строка [SC] SetServiceObjectSecurity: успех
![]()
4) командой auditpol /get /category:* проверяем какой аудит включен в системе. Нам необходимо, чтобы был включен аудит для подкатегорий «Другие события доступа к объекту» и «Работа с дескриптором». В английской Windows они соответственно называются «Other Object Access Events» и «Handle Manipulation». Если аудит не настроен, то делаем это через групповые политики, если компьютер в домене или через команды auditpol /set /subcategory:"Другие события доступа к объекту" /success:enable /failure:disable и auditpol /set /subcategory:"Работа с дескриптором" /success:enable /failure:disable, если компьютер не в домене.
5) фильтруем журнал безопасности Windows по коду события «4656» и можем видеть событие в журнале
Поиск по реестру Windows через командную строку или powershell
Иногда очень нужно в скриптах выполнить поиск определенного ключа и например поменять его. Для того чтобы осуществить поиск в Windows есть команда reg query. Ее нужно запускать с определенными ключами. У меня эта команда обычно выглядит следующим образом:
reg query HKCU\Software\Microsoft /f "test" /s /d /e
HKCU\Software\Microsoft — ветка реестра, по которой осуществляется поиск; после ключа /f вписываем в кавычках шаблон для поиска; ключ /s осуществляет поиск по вложенным подразделам и их параметрам; ключ /d указываем на поиск только по данным, а не по названию ключей и наконец ключ /e, говорит, что надо возвращать только точные совпадения.




