This PowerShell script automates the process of joining a Windows client to an Active Directory domain. It allows you to specify required parameters in a configuration file and perform the domain join automatically.
- Automatically join a Windows client to an AD domain.
- Optionally change DNS server settings before joining.
- Supports both plain text and encrypted passwords.
- Allows specifying the encryption key via file or directly as a Base64-encoded string.
- Ability to specify the OUPath for the computer account.
- Allows specifying network interfaces for DNS configuration.
- Configuration parameters are loaded from an external file.
- Windows 10 or later.
- PowerShell with administrative privileges.
- Network connectivity to the domain controller.
Create a configuration file (e.g., config.psd1) with the necessary parameters.
domain(string): The domain to join. Example:"ad.example.com"username(string): The username for authentication. Example:"AD\Administrator"password(string, optional): The plain text password.securePassword(string, optional): The encrypted password.keyFilePath(string, optional): The path to the key file for decryption.key(string, optional): Base64-encoded key string.OUPath(string, optional): OU path for the computer account.dnsServers(array of strings, optional): DNS server IP addresses.interfaceNames(array of strings, optional): Network interface names.
Note: Either password or securePassword must be specified.
@{
domain = "ad.example.com"
username = "AD\Administrator"
# Option 1: Use plain text password
#password = "YourPasswordHere"
# Option 2: Use secure password
securePassword = "YourEncryptedPasswordString"
# Key specification (optional)
# Option A: Specify key file path
#keyFilePath = "C:\secure\encryptionkey.key"
# Option B: Specify key directly as Base64-encoded string
#key = "Base64EncodedKeyString"
# OUPath specification (optional)
OUPath = "CN=Computers,DC=ad,DC=example,DC=com"
# DNS servers (optional)
dnsServers = @("192.168.0.1")
# Interface names (optional)
interfaceNames = @("Ethernet", "Wi-Fi")
}Open PowerShell with administrative privileges and execute the script:
.\AutoDomainJoin.ps1 -ConfigFilePath ".\config.psd1"If you do not specify the -ConfigFilePath parameter, it defaults to .\config.psd1.
-
Generate the Key
# Generate a key and encode it in Base64 $key = New-Object Byte[] 32 [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($key) $keyBase64 = [Convert]::ToBase64String($key)
-
Encrypt the Password
# Use the Base64-encoded key to encrypt the password $key = [Convert]::FromBase64String($keyBase64) $secureString = Read-Host -AsSecureString -Prompt "Enter Password" $encryptedPassword = $secureString | ConvertFrom-SecureString -Key $key
-
Update the Configuration File
- Set
securePasswordto the value of$encryptedPassword. - Set
keyto the value of$keyBase64.
- Set
@{
domain = "ad.example.com"
username = "AD\Administrator"
securePassword = "YourEncryptedPasswordString"
key = "Base64EncodedKeyString"
# Other parameters...
}-
Generate the Key
# Generate a key $key = New-Object Byte[] 32 [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($key)
-
Save the Key
# Save the key to a file $key | Set-Content -Path "C:\secure\encryptionkey.key" -Encoding Byte
# Read the key from the file
$key = Get-Content -Path "C:\secure\encryptionkey.key" -Encoding Byte
$secureString = Read-Host -AsSecureString -Prompt "Enter Password"
$encryptedPassword = $secureString | ConvertFrom-SecureString -Key $key- Set
securePasswordto the value of$encryptedPassword. - Set
keyFilePathto the path of the key file.
@{
domain = "ad.example.com"
username = "AD\Administrator"
securePassword = "YourEncryptedPasswordString"
keyFilePath = "C:\secure\encryptionkey.key"
# Other parameters...
}- Password Handling: Storing passwords in plain text is insecure. It is recommended to use encrypted passwords.
- Key Management: Keep the key secure and prevent unauthorized access.
- Access Control: Secure the configuration and key files by setting appropriate file permissions.
This project is licensed under the MIT License.