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 passwordsecurePassword="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.