diff --git a/Documentation/PowerShell/New-ADDBRestoreFromMediaScript.md b/Documentation/PowerShell/New-ADDBRestoreFromMediaScript.md index f5a522f..fd2abc0 100644 --- a/Documentation/PowerShell/New-ADDBRestoreFromMediaScript.md +++ b/Documentation/PowerShell/New-ADDBRestoreFromMediaScript.md @@ -170,14 +170,14 @@ $initTask = Register-ScheduledJob -Name DSInternals-RFM-Initializer -ScriptBlock # Re-encrypt the DB with the new boot key. $currentBootKey = Get-BootKey -Online - Set-ADDBBootKey -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -OldBootKey 610bc29e6f62ca7004e9872cd51a0116 -NewBootKey $currentBootKey + Set-ADDBBootKey -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -OldBootKey 610bc29e6f62ca7004e9872cd51a0116 -NewBootKey $currentBootKey -Force # Clone the DC account password. $ntdsParams = Get-ItemProperty -Path registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters InlineScript { # Note: SupplementalCredentials do not get serialized properly without using the InlineScript activity. $dcAccount = Get-ADDBAccount -SamAccountName 'LON-DC1$' -DatabasePath $using:ntdsParams.'DSA Database file' -LogPath $using:ntdsParams.'Database log files path' -BootKey $using:currentBootKey - Set-ADDBAccountPasswordHash -ObjectGuid 9bb4d6f4-060a-4585-9f18-625774e7c088 -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -BootKey $using:currentBootKey + Set-ADDBAccountPasswordHash -ObjectGuid 9bb4d6f4-060a-4585-9f18-625774e7c088 -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -BootKey $using:currentBootKey -Force } # Replace the database and transaction logs. diff --git a/Documentation/PowerShell/Set-ADDBBootKey.md b/Documentation/PowerShell/Set-ADDBBootKey.md index 026a8a2..af2c708 100644 --- a/Documentation/PowerShell/Set-ADDBBootKey.md +++ b/Documentation/PowerShell/Set-ADDBBootKey.md @@ -13,7 +13,7 @@ Re-encrypts a ntds.dit file with a new BootKey/SysKey. ## SYNTAX ``` -Set-ADDBBootKey -OldBootKey <Byte[]> [-NewBootKey <Byte[]>] -DatabasePath <String> [-LogPath <String>] +Set-ADDBBootKey -OldBootKey <Byte[]> [-NewBootKey <Byte[]>] [-Force] -DatabasePath <String> [-LogPath <String>] [<CommonParameters>] ``` @@ -49,6 +49,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -Force +Forces the cmdlet to perform the desired operation. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -LogPath Specifies the path to a directory where the transaction log files are located. For instance, C:\Windows\NTDS. The default log directory is the one that contains the database file itself. diff --git a/Src/DSInternals.PowerShell/ADDBRestoreFromMediaScriptTemplate.ps1 b/Src/DSInternals.PowerShell/ADDBRestoreFromMediaScriptTemplate.ps1 index 92f547f..d201f93 100644 --- a/Src/DSInternals.PowerShell/ADDBRestoreFromMediaScriptTemplate.ps1 +++ b/Src/DSInternals.PowerShell/ADDBRestoreFromMediaScriptTemplate.ps1 @@ -1,12 +1,11 @@ <# .SYNOPSIS -Restores the {DCName} domain controller from ntds.dit. +Restores the {DCName} domain controller from its ntds.dit file. .REMARKS This script should only be executed on a freshly installed {OSName}. Use at your own risk. The DSInternals PowerShell module must be installed for all users on the target server. - Author: Michael Grafnetter #> @@ -20,7 +19,7 @@ $vssResult = ([wmiclass] 'Win32_ShadowCopy').Create("$env:SystemDrive\", 'Client Write-Host 'Installing the Active Directory module for Windows PowerShell...' Add-WindowsFeature -Name RSAT-AD-PowerShell -ErrorAction Stop -# All the other operations will be executed by a restartable workflow running in SYSTEM context. +# All the other operations will be executed by a restartable workflow running in the SYSTEM context. Write-Host 'Registering restartable workflows...' # Delete any pre-existing scheduled jobs with the same names before registering new ones. @@ -73,14 +72,14 @@ $initTask = Register-ScheduledJob -Name DSInternals-RFM-Initializer -ScriptBlock # Re-encrypt the DB with the new boot key. $currentBootKey = Get-BootKey -Online - Set-ADDBBootKey -DatabasePath '{SourceDBPath}' -LogPath '{SourceLogDirPath}' -OldBootKey {OldBootKey} -NewBootKey $currentBootKey + Set-ADDBBootKey -DatabasePath '{SourceDBPath}' -LogPath '{SourceLogDirPath}' -OldBootKey {OldBootKey} -NewBootKey $currentBootKey -Force # Clone the DC account password. $ntdsParams = Get-ItemProperty -Path registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters InlineScript { # Note: SupplementalCredentials do not get serialized properly without using the InlineScript activity. $dcAccount = Get-ADDBAccount -SamAccountName '{DCName}$' -DatabasePath $using:ntdsParams.'DSA Database file' -LogPath $using:ntdsParams.'Database log files path' -BootKey $using:currentBootKey - Set-ADDBAccountPasswordHash -ObjectGuid {DCGuid} -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath '{SourceDBPath}' -LogPath '{SourceLogDirPath}' -BootKey $using:currentBootKey + Set-ADDBAccountPasswordHash -ObjectGuid {DCGuid} -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath '{SourceDBPath}' -LogPath '{SourceLogDirPath}' -BootKey $using:currentBootKey -Force } # Replace the database and transaction logs. diff --git a/Src/DSInternals.PowerShell/Commands/Datastore/RestoreADDBAttributeCommand.cs b/Src/DSInternals.PowerShell/Commands/Datastore/RestoreADDBAttributeCommand.cs index 2073f1d..8b5a451 100644 --- a/Src/DSInternals.PowerShell/Commands/Datastore/RestoreADDBAttributeCommand.cs +++ b/Src/DSInternals.PowerShell/Commands/Datastore/RestoreADDBAttributeCommand.cs @@ -1,5 +1,6 @@ using System; using System.Management.Automation; +using DSInternals.PowerShell.Properties; namespace DSInternals.PowerShell.Commands { @@ -25,6 +26,13 @@ namespace DSInternals.PowerShell.Commands set; } + [Parameter] + public SwitchParameter Force + { + get; + set; + } + protected override bool ReadOnly { get @@ -36,6 +44,14 @@ namespace DSInternals.PowerShell.Commands protected override void ProcessRecord() { throw new NotImplementedException(); + + if (!Force.IsPresent) + { + // Do not continue with operation until the user enforces it. + var exception = new ArgumentException(Resources.WarningMessage); + var error = new ErrorRecord(exception, "RestoreADDBAttribute_ForceRequired", ErrorCategory.InvalidArgument, null); + this.ThrowTerminatingError(error); + } } } -} \ No newline at end of file +} diff --git a/Src/DSInternals.PowerShell/Commands/Datastore/SetADDBBootKeyCommand.cs b/Src/DSInternals.PowerShell/Commands/Datastore/SetADDBBootKeyCommand.cs index 454e622..6bd87bc 100644 --- a/Src/DSInternals.PowerShell/Commands/Datastore/SetADDBBootKeyCommand.cs +++ b/Src/DSInternals.PowerShell/Commands/Datastore/SetADDBBootKeyCommand.cs @@ -1,7 +1,9 @@ namespace DSInternals.PowerShell.Commands { + using System; using System.Management.Automation; using DSInternals.DataStore; + using DSInternals.PowerShell.Properties; [Cmdlet(VerbsCommon.Set, "ADDBBootKey")] [OutputType("None")] @@ -29,8 +31,23 @@ set; } + [Parameter] + public SwitchParameter Force + { + get; + set; + } + protected override void BeginProcessing() { + if (!Force.IsPresent) + { + // Do not continue with operation until the user enforces it. + var exception = new ArgumentException(Resources.WarningMessage); + var error = new ErrorRecord(exception, "SetADDBBootKey_ForceRequired", ErrorCategory.InvalidArgument, null); + this.ThrowTerminatingError(error); + } + base.BeginProcessing(); using(var directoryAgent = new DirectoryAgent(this.DirectoryContext)) { diff --git a/Src/DSInternals.PowerShell/en-US/DSInternals.PowerShell.dll-Help.xml b/Src/DSInternals.PowerShell/en-US/DSInternals.PowerShell.dll-Help.xml index 3de0e73..d9b8648 100644 --- a/Src/DSInternals.PowerShell/en-US/DSInternals.PowerShell.dll-Help.xml +++ b/Src/DSInternals.PowerShell/en-US/DSInternals.PowerShell.dll-Help.xml @@ -7101,14 +7101,14 @@ $initTask = Register-ScheduledJob -Name DSInternals-RFM-Initializer -ScriptBlock # Re-encrypt the DB with the new boot key. $currentBootKey = Get-BootKey -Online - Set-ADDBBootKey -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -OldBootKey 610bc29e6f62ca7004e9872cd51a0116 -NewBootKey $currentBootKey + Set-ADDBBootKey -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -OldBootKey 610bc29e6f62ca7004e9872cd51a0116 -NewBootKey $currentBootKey -Force # Clone the DC account password. $ntdsParams = Get-ItemProperty -Path registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters InlineScript { # Note: SupplementalCredentials do not get serialized properly without using the InlineScript activity. $dcAccount = Get-ADDBAccount -SamAccountName 'LON-DC1$' -DatabasePath $using:ntdsParams.'DSA Database file' -LogPath $using:ntdsParams.'Database log files path' -BootKey $using:currentBootKey - Set-ADDBAccountPasswordHash -ObjectGuid 9bb4d6f4-060a-4585-9f18-625774e7c088 -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -BootKey $using:currentBootKey + Set-ADDBAccountPasswordHash -ObjectGuid 9bb4d6f4-060a-4585-9f18-625774e7c088 -NTHash $dcAccount.NTHash -SupplementalCredentials $dcAccount.SupplementalCredentials -DatabasePath 'C:\Backup\Active Directory\ntds.dit' -LogPath 'C:\Backup\Active Directory' -BootKey $using:currentBootKey -Force } # Replace the database and transaction logs. @@ -8978,6 +8978,17 @@ PS C:\> Set-ADDBAccountPasswordHash -SamAccountName john ` </dev:type> <dev:defaultValue>None</dev:defaultValue> </command:parameter> + <command:parameter required="false" variableLength="true" globbing="false" pipelineInput="False" position="named" aliases="none"> + <maml:name>Force</maml:name> + <maml:Description> + <maml:para>Forces the cmdlet to perform the desired operation.</maml:para> + </maml:Description> + <dev:type> + <maml:name>SwitchParameter</maml:name> + <maml:uri /> + </dev:type> + <dev:defaultValue>False</dev:defaultValue> + </command:parameter> <command:parameter required="false" variableLength="true" globbing="false" pipelineInput="False" position="named" aliases="Log, TransactionLogPath"> <maml:name>LogPath</maml:name> <maml:Description> @@ -9029,6 +9040,18 @@ PS C:\> Set-ADDBAccountPasswordHash -SamAccountName john ` </dev:type> <dev:defaultValue>None</dev:defaultValue> </command:parameter> + <command:parameter required="false" variableLength="true" globbing="false" pipelineInput="False" position="named" aliases="none"> + <maml:name>Force</maml:name> + <maml:Description> + <maml:para>Forces the cmdlet to perform the desired operation.</maml:para> + </maml:Description> + <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue> + <dev:type> + <maml:name>SwitchParameter</maml:name> + <maml:uri /> + </dev:type> + <dev:defaultValue>False</dev:defaultValue> + </command:parameter> <command:parameter required="false" variableLength="true" globbing="false" pipelineInput="False" position="named" aliases="Log, TransactionLogPath"> <maml:name>LogPath</maml:name> <maml:Description>