Domain Controller starts up in Safe Mode

Domain Controller starts up in Safe Mode

KB ID: 1277
Products: Veeam Backup & Replication
Version: 7.x, 8.x, 9.x
Published: 2011-10-06
Last Modified: 2016-08-08

Challenge

After doing a full Virtual Machine restore, Instant Recovery, or testing of a Replica, you will find that the Virtual Machine boots up in what appears to be safe mode.

When the Domain Controller boots for the first time it is actually in Active Directory services restore mode.

Cause

This is normal for this to happen as we’re booting from a backup file, however it should reboot automatically.

Solution

Login with the Directory services restore mode account (typically .\administrator) and open a command prompt and run the following:

bcdedit /deletevalue safeboot
shutdown -t 01 -r
Afterwards it should reboot in normal mode.
For Windows Server 2003:
BCDEdit does not work for Windows 2003 server, so you may use BOOTCFG.exe or Edit BOOT.INI file to remove the SAFEBOOT parameter of the entry.

More Information

Please reference the Microsoft Knowledge Base Article below for further details:

http://technet.microsoft.com/en-us/library/cc816897(WS.10).aspx

For a complete guide of how to restore a Domain Controller from a Veeam Backup please see this KB:

https://www.veeam.com/kb2119




Оперативный контроль аккаунтов пользователей и компьютеров в Active Directory

Обновлено 20.03.2013. Внесен ряд исправлений
В скриптах, связанных с удалением компьютерных учетных записей не выводилось имя компьютера
Кроме того, как оказалось, при массовых операциях, например вводах в группу или удалении из группы, приходит только одно уведомление, что само по себе не очень правильно. В связи с этим скрипты несколько переделаны — вместо последнего, отбираются все такие события за последние 120 секунд

Недавно я публиковал заметку Автоматическое уведомление о заблокированных аккаунтах. Там было вполне рабочее решение, но у него был один недостаток – информация приходила в несколько “корявом” виде. В песочнице хабры я нашел нашел статью, в которой аналогичные вещи сделаны гораздо удобнее.

На ее основании я сделал  десяток скриптов, которые будут информировать вас о:

— блокировании и разблокировании (lock/unlock) учетных записей пользователей
— добавлении или удалении кого-либо в/из группы
— включение или выключение (enable/disable) пользовательского аккаунта

— добавление или удаление компьютера в/из домена
— добавление или удаление пользователя в/из домена

Все нижеприведенные скрипты сохраняются в файлы, по одному в каждый из файлов, файлы кладутся на контроллер домена, там же запускается Task Scheduler и в нем создается задача с триггером на соответствующий EventID в Security Log, например 4740, и действием, содержащим запуск C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe с параметром в виде пути к скрипту и его именем, например, C:\cmd\event-notification-4740-account_lockout.ps1

В результате, вы оперативно получаете информацию по важным изменениям в AD и можете на нее оперативно реагировать

#Отправка уведомлений по наступлению события 4740 — блокирование учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Заблокирован аккаунт»
$Theme = “Только что был заблокирован аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -maxevents 1 -FilterHashtable @{LogName=”Security”;ID=4740;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetDomainName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4767 — разблокирование учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Разблокирован аккаунт”
$Theme = “Только что был разблокирован аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -maxevents 1 -FilterHashtable @{LogName=”Security”;ID=4767;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetDomainName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4728 — Добавление учетной записи в группу
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Добавление учетной записи в группу”
$Theme = “Учетная запись добавлена в группу”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4728;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя группы”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}, @{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “MemberName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4729 — Удаление учетной записи из группы
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи из группы”
$Theme = “Учетная запись удалена из группы”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4729;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя группы”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}, @{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “MemberName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4722 — включение учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Аккаунт включен»
$Theme = “Только что был включен аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4722;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4725 — отключение учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Аккаунт выключен»
$Theme = “Только что был выключен аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4725;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4741 — Создание учетной записи компьютера в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Создание учетной записи компьютера в домене”
$Theme = “Добавлен новый компьютер в домен”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4743 — Удаление учетной записи компьютера в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи компьютера в домене”
$Theme = “Компьютер удален из домена”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “john@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4743;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4720 — Создание учетной записи пользователя в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Создание учетной записи пользователя в домене”
$Theme = “Добавлен новый пользователь в домен”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4720;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4726 — Удаление учетной записи пользователя из домена
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи пользователя из домена”
$Theme = “Удален пользователь из домена”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4726;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


Если у вас Windows Server 2003, то так красиво сделать не получился, т.к. ее Task Scheduler существенно хуже того, что есть сейчас. Но можно сделать по другому — сделать задачу, запускающую скрипт раз в 5 минут, а выборку в скриптах модифицировать следующим образом: отбирать события за последних 6 минут. Получится:

Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4740;StartTime=(Get-Date).AddMinutes(-6)}

Остальное — аналогично