Работа с Windows Server – пишу для себя повседневные приёмы работы с сервером. Заметка не претендует на полноту и со временем будет дополняться.
Устранение ошибок
Подразумевается что есть уверенность насчет хорошего состояния железа – памяти, жесткого диска, рабочей температуры процессора и отсутствуют программные зловреды – вирусы, косое/кривое/несовместимое/устаревшее ПО. Также считается, что Windows еще “не укатана” до того состояния, когда она вываливается в BSOD при загрузке. Вот из этого и исходим – работает, но плохо.
Чистка
Много ошибок встречается когда Windows сильно замусорена, какие-то непонятные ошибки, а потом оказывается что гигабайты, а то и десяток гигабайт временных файлов. Чистить – DISM++ для Windows 2008 и выше (от 2003 нужно уже отказываться, функционала ведь никакого и на мой взгляд, оставить эту ОС можно только для старых серверов, при условии, что работает она хорошо – несложные сетевые шары, вот весь спектр вариантов использования данной ОС в 2017+ году).
Тут же приводим в порядок системный репозиторий Windows, хранящийся в папке WinSxS. Соответствующий чекбокс в Dism++, на старых инсталляциях легко можно получить выигрыш свободного места 10-15GB.
В последних версиях Dism++ чистка WinSxS не отрабатывает, другой вариант чистить при помощи скрипта:
sc stop msiserver sc stop TrustedInstaller sc config msiserver start= disabled sc config TrustedInstaller start= disabled icacls "%WINDIR%\WinSxS" /save "%WINDIR%\WinSxS.acl" /t takeown /f "%WINDIR%\WinSxS" /r icacls "%WINDIR%\WinSxS" /grant %username%:(F) /t compact /s:"%WINDIR%\WinSxS" /c /a /i * icacls "%WINDIR%\WinSxS" /setowner "NT SERVICE\TrustedInstaller" /t icacls "%WINDIR%" /restore "%WINDIR%\WinSxS.acl" sc config msiserver start= demand sc config TrustedInstaller start= demand
Особенна полезна чистка на терминальных серверах, где место дорого, по этой же причине всегда включаю там Квоты:

Последнее – чистим реестр Windows. Какое средство выбрать, каждый решает сам, пользуюсь Ccleaner – чистит он неглубоко, зато гарантированно ничего не угробит. Ставим общий автозапуск для всех пользователей:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "CCleaner Monitoring"="\"C:\\Program Files\\CCleaner\\CCleaner.exe\" /MONITOR"
Проделав данные манипуляции, возможно большинство проблем вы не решите, но часть из них точно уйдет, плюс ОС начинает работать быстрее даже на глаз – чем старее инсталляция, тем заметнее.
Ошибки Windows
Ошибки самой Windows. Под ошибками здесь подразумеваю не ошибки, скажем, в просмотре событий, а какое-то нештатное поведение ОС, снижающее функциональность, то есть другими словами – когда что-то не работает – то, что должно работать. Можно конечно найти решение в интернете или FixIt от MS – и возможно поможет, но это скорее заплата, латание дыр, потом может вылезти еще проблема, затем еще.. Если ситуация именно такова, то нужны общие методы оздоровления системы, а не заплаты.
Проверяем целостность системных файлов
Первый способ – для этого запускаем командную строку от Администратора и выполняем команду:
sfc /scannow
Работает даже на таких древних ОС как Windows Server 2003 (вот как раз для неё нужно будет вставить компакт-диск с дистрибутивом).
Ошибки не найдены – хорошо, найдены и исправлены – хорошо, найдены и исправлены частично – плохо. В последнем случае проверку нужно повторять по мере выполнения других процедур. В конечном итоге ошибок в файлах быть не должно.
Второй способ для новых ОС начиная с Windows Server 2012 используя DISM.exe также с помощью командной строки:
- DISM.exe /Online /Cleanup-image /CheckHealth — для получения информации о состоянии и наличии повреждений компонентов Windows. При этом сама проверка не производится, а лишь проверяются ранее записанные значения;
- DISM.exe /Online /Cleanup-image /ScanHealth — проверка целостности и наличия повреждений хранилища компонентов. Может занять продолжительное время и может показаться, что команда зависла, но на самом деле нужно будет подождать ещё немного;
- DISM.exe /Online /Cleanup-image /Restorehealth — производит и проверку и автоматическое восстановление системных файлов Windows.
Восстанавливаем WMI
WMI — как говорит Википедия:
..WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows...
Понятное дело, что если Windows не может адекватно оценивать свое состояние, то есть есть ошибки в WMI, никакой нормальной работы не получится. Предлагаю воспользоваться отличным средством – на ваш страх и риск! – которым пользовался и пользуюсь – //www.lansweeper.com/kb/47/How-to-repair-a-corrupt-WMI-installation.html
Ошибки ПО
Глючит или не запускается установленное ПО. Можно смотреть журналы, искать ошибки и искать в интернете солюшены, но есть более универсальный метод, который помогает не во всех, но во многих случаях. Поскольку с нуля ПО давно уже никто не пишет и большинство программ написано с использованием сред разработки NET. Framework 1-2-3-4, то достаточно восстановить рабочее состояние этой среды для устранения ошибок приложения. Сделать можно быстрее и проще всего с помощью специального инструмента NetFxRepairTool. Это первый инструмент, который нужно использовать и только в случае когда он не поможет, вот тогда уже начинать ломать голову и поиски решений в интернете.
Скрипты
Функционал Windows совершенствуется от версии к версии, хорошо, но до такого состояния, что все нужные утилиты и инструменты будут под рукой, очень далеко. И тут на выручку приходят самописные скрипты – cmd, vbs, ps1. Поскольку помнить их на память нереально, а искать каждый раз по интернету и тратить время на доработку – долго, то образцы рабочих скриптов нужно где-то складировать. Буду делать это здесь.
Обычные скрипты
Запускаются встроенным Планировщиком Windows.
Архивация файловой шары
CMD скрипт:
@echo off "c:\program files\7-zip\7z.exe" a -r -m0=BZip2 -mmt=on -mx5 -ssw \\Server\D$\Папка\Файл-%date%.7z D:\Папка_которую_нужно_жать | findstr /P /I /V "Compressing 7-Zip" >> \\Server\D$\Папка\log_file.%date%.txt
- -ssw архивирует открытые другими программами файлы;
- -mmt=on использовать многопоточность (в 8 параллельных потоков -mmt=8);
- -ms=off создается не solid-архив;
- -mx3 степень сжатия (стандартная 5, высокая 7);
- для более чем двухъядерных систем лучше использовать bzip2 формат (родной для 7z формат сжатия LZMA поддерживает только 2-а потока, остальные форматы сжатия максимум один поток).
Команда FINDSTR для сохранения в лог файл только нужной информации.
- /P пропускает строки, содержащие непечатные символы;
- /I на всякий случай игнорирую регистр букв;
- /V ” ” непосредственно перечень слов для поиска в строках и последующего исключения этих строк.
Полученный лог файл можно нормально прочитать, если открыть через браузер.
Чистка устаревших архивов
VBS скрипт:
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Directory = Fso.GetFolder("D:\Папка_для_чистки")
Set Files = Directory.Files
For Each Modified in Files
If DateDiff("D", Modified.DateLastModified, Now) > 18 Then Modified.Delete
Next
Конструкций For-Then-Next можно напихать несколько, число – архивы старше количества дней числа будут удалены.
Архив MS SQL
CMD скрипт:
sqlcmd -S имя_сервера -U имя_юзера_sql -P пароль -i d:\скрипт_sql.sql "c:\Program Files\7-zip\7z.exe" a -m0=lzma2 -mmt=on d:\Файл_%date%.7z \\Server\D$\tmp\*.bak del \\Server\D$\tmp\*.bak
работает вместе с SQL скриптом:
DECLARE @pathName NVARCHAR(512) SET @pathName = 'D:\tmp\Промежуточное_имя_' + Convert(varchar(8), GETDATE(), 112) + '.bak' BACKUP DATABASE [Имя_базы] TO DISK = @pathName WITH NOFORMAT, NOINIT, NAME = N'Промежуточное_имя', SKIP, NOREWIND, NOUNLOAD, STATS = 10
- Позволяет выгружать базы на удалённый сервер, чего не умеет встроенный в SQL Планировщик;
- Позволяет запускать скрипт как на сервере с SQL и выгружать на удаленный сервер, так и на удаленном сервере непосредственно;
- CMD скрипт запускает SQL скрипт, тот выгружает базы в локальную папку tmp, затем CMD скрипт жмёт содержимое папки на удаленный сервер и после очищает её;
- Конструкций SET-DECLARE-BACKUP в SQL скрипте может быть несколько.
Оповещение о перезагрузке сервера
PS1 скрипт:
#IP-адрес или доменное имя почтового сервера, например, mail.ionline.by
$IPMailServer="ip"
#Адрес отправителя. Внимание, он же является логином для авторизации.
$SenderEmail="e-mail"
#Адрес получателя
$RecipientEmail="e-mail2"
#Пароль на ящик
$pass = 'пароль'
#Functions
function Send-mail ($subj = "VM" ,$body = "Text", $AttachPath = "0")
{
$SMTPClient = new-object System.Net.Mail.SMTPClient
$Msg = new-object System.Net.Mail.MailMessage
if ($AttachPath -ne "0")
{
$Attach = new-object System.Net.Mail.Attachment($AttachPath)
$Msg.Attachments.add($Attach)
}
$Msg.To.Add($RecipientEmail)
$Msg.from=$SenderEmail
$Msg.Subject = $subj
$Msg.Body= $body
$SMTPClient.Host=$IPMailServer
$SMTPClient.Credentials=New-Object System.Net.NetworkCredential "$SenderEmail" , "$pass"
$SMTPClient.Send($Msg)
#$Attach.Dispose()
}
#Code
$time = Get-Date
$servname = $env:computername
$date = Get-Date -UFormat %T
Send-mail -subj "$date $servname включение сервера" -body "$time ВНИМАНИЕ! Сервер $servname был включен (плановая перезагрузка в субботу в 6 утра)."
Скрипты через групповые политики
Создает новый объект групповой политики, редактируется, затем либо в секции User configuration-Polices-Windows settings-Scripts (Logon/Logoff), либо в секции Computer configuration-Polices-Windows settings-Scripts (Startup/Shutdown) определяется нужный скрипт. Вторую секцию лучше отключить и нужно правильно применить политику – если политика Computer configuration, то применить к OU, где находятся компьютеры, если User configuration, то к OU, где находятся пользователи – иначе не будет работать. Выбор простой: для всех пользователей компьютера – скрипт в Computer configuration, для избранных – в секцию User configuration. Подробнее можно прочесть в интернете.
Добавление сетевого диска
CMD скрипт:
@net use Z: \\Шара
- Скрипт пересоздаёт диск каждый раз;
- Конструкций Net Use может быть несколько.
VBS скрипт:
dim wn, fs, oDrives, source
set fs=Wscript.CreateObject("Scripting.FileSystemObject")
set wn=Wscript.CreateObject("Wscript.Network")
Set oDrives = wn.EnumNetworkDrives
Source = "\\Шара"
if fs.DriveExists("O:") then
For i = 0 to oDrives.Count - 1
if oDrives.Item(i) = Source then
wscript.quit
else
end if
next
wn.RemoveNetworkDrive "O:",Force,true
wn.MapNetworkDrive "O:",Source,false
else
wn.MapNetworkDrive "O:",Source,false
End if
- Проверяет подключён уже этот диск или нет;
- Конструкций IF-END IF может быть несколько.
Ярлык Консультант+
VBS скрипт:
Dim WSHSysEnv, DesktopPath, FSO, WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
DesktopPath = WSHShell.SpecialFolders("Desktop")
Set WSHSysEnv = WSHShell.Environment("Process")
strProfile = WSHSysEnv.Item("USERPROFILE")
FileName = "\\Шара\Consultant.lnk"
if not FSO.FolderExists(strProfile & "\ConsUserData") Then
fso.createfolder strProfile & "\ConsUserData"
Else
End If
if not FSO.FileExists(strDesktop & "\Consultant.lnk") Then
fso.CopyFile FileName, DesktopPath & "\Consultant.lnk", true
Else
WScript.Quit
End If
Берёт ярлык из шары и запихивает его на Рабочий стол пользователя, попутно создаёт папку в профиле пользователя ConsUserData и вся работа ведётся через эту папку, а не через папку в корне диска C:/. Для этого в самом ярлыке нужно указать Start in:

Ярлык с заданной картинкой
VBS скрипт на примере ярлыка для почты Zimbra:
Dim MyShortcut, MyDesktop, DesktopPath, FSO, WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
DesktopPath = WSHShell.SpecialFolders("Desktop")
icotarget = WSHShell.SpecialFolders("MyDocuments")
FileName = "\\Шара\zimbra.ico"
if not FSO.FileExists(icotarget & "\Zimbra\Zimbra.ico") Then
fso.createfolder icotarget & "\Zimbra"
fso.CopyFile FileName, icotarget & "\Zimbra\Zimbra.ico", true
Else
End If
if not FSO.FileExists(strDesktop & "\Zimbra.lnk") Then
Set MyShortcut = WSHShell.CreateShortcut(DesktopPath &_
"\Zimbra.lnk")
MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings _
("https://ip")
MyShortcut.Windowstyle="4"
MyShortcut.IconLocation = WSHShell.ExpandEnvironmentStrings _
(icotarget & "\Zimbra\Zimbra.ico")
MyShortcut.Save
Else
WScript.Quit
End If
Скрипт берёт картинку для ярлыка из шары и создаёт на Рабочем столе пользователя ярлык на страницу входа в Zimbra для браузера по умолчанию.
Буду добавлять по мере возможности.
Полезные материалы от MS.

