Работа с 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.