No cenário moderno de TI, garantir que um computador entre no domínio apropriado é mais do que uma conveniência – é uma etapa essencial para consolidar o controle, simplificar o acesso e manter a segurança da rede. Esse script do PowerShell foi projetado para simplificar o processo de adição de um computador a um domínio.
Histórico
O PowerShell ganhou destaque entre os profissionais de TI e os provedores de serviços gerenciados (MSPs) como uma linguagem de script robusta e versátil. Sua flexibilidade permite que os administradores automatizem tarefas repetitivas, apliquem políticas e configurem sistemas rapidamente. O script apresentado aqui tem uma função crucial: ele permite que os computadores ingressem em um domínio sem problemas. Os domínios são essenciais no mundo da TI empresarial, pois facilitam o compartilhamento de recursos, a autenticação centralizada e a aplicação de políticas. Assim, um script que pode adicionar computadores a um domínio de forma confiável agrega um valor imenso.
O roteiro
#Requires -Version 5.1
<#
.SYNOPSIS
Joins a computer to a domain.
.DESCRIPTION
Joins a computer to a domain.
.EXAMPLE
-DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1"
Joins a computer to a "Domain.com" domain and restarts the computer. Don't expect a success result in Ninja as the computer will reboot before the script can return a result.
.EXAMPLE
-DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart
Joins a computer to a "Domain.com" domain and does not restart the computer.
.EXAMPLE
PS C:> Join-Domain.ps1 -DomainName "domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart
Joins a computer to a "Domain.com" domain and does not restart the computer.
.EXAMPLE
-DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -Server "192.168.0.1"
Not recommended if the computer this script is running on does not have one of the Domain Controllers set as its DNS server.
Joins a computer to a "Domain.com" domain, talks to the domain with the IP address of "192.168.0.1", and restarts the computer.
.OUTPUTS
String[]
.NOTES
Minimum OS Architecture Supported: Windows 10, Windows Server 2016
Release Notes:
Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms.
Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party.
Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider.
Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations.
Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks.
Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script.
EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
.COMPONENT
ManageUsers
#>
[CmdletBinding()]
param (
# Domain Name to join computer to
[Parameter(Mandatory = $true)]
[String]
$DomainName,
# Use a Domain UserName to join this computer to a domain, this requires the Password parameter to be used as well
[Parameter(Mandatory = $true)]
[String]
$UserName,
# Use a Domain Password to join this computer from a domain
[Parameter(Mandatory = $true)]
$Password,
# Used only when computer can't locate a domain controler via DNS or you wish to connect to a specific DC
[Parameter()]
$Server,
# Do not restart computer after joining to a domain
[Switch]
$NoRestart
)
begin {
function Join-ComputerToDomainPS2 {
param (
[String]
$DomainName,
[PSCredential]
$Credential,
$Restart,
$Server
)
if ($Credential) {
# Use supplied Credentials
if ($Server) {
Add-Computer -DomainName $DomainName -Credential $Credential -Server $Server -Force -Confirm:$false -PassThru
}
else {
Add-Computer -DomainName $DomainName -Credential $Credential -Force -Confirm:$false -PassThru
}
}
else {
# No Credentials supplied, use current user
Add-Computer -DomainName $DomainName -Force -Confirm:$false -PassThru
}
}
Write-Output "Starting Join Domain"
# Convert username and password into a credential object
$JoinCred = [PSCredential]::new($UserName, $(ConvertTo-SecureString -String $Password -AsPlainText -Force))
}
process {
Write-Output "Joining computer($env:COMPUTERNAME) to domain $DomainName"
$script:JoinResult = $false
try {
$JoinResult = if ($NoRestart) {
# Do not restart after joining
if ($PSVersionTable.PSVersion.Major -eq 2) {
if ($Server) {
(Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded
}
else {
(Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded
}
}
else {
if ($Server) {
(Add-Computer -DomainName $DomainName -Credential $JoinCred -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded
}
else {
(Add-Computer -DomainName $DomainName -Credential $JoinCred -Force -Confirm:$false -PassThru).HasSucceeded
}
}
}
else {
# Restart after joining
if ($PSVersionTable.PSVersion.Major -eq 2) {
if ($Server) {
(Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded
}
else {
(Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded
}
}
else {
if ($Server) {
(Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded
}
else {
(Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Force -Confirm:$false -PassThru).HasSucceeded
}
}
}
}
catch {
Write-Error "Failed to Join Domain: $DomainName"
}
if ($NoRestart -and $JoinResult) {
Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and not restarting computer"
}
elseif ($JoinResult) {
Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and restarting computer"
if ($PSVersionTable.PSVersion.Major -eq 2) {
shutdown.exe -r -t 60
}
}
else {
Write-Output "Failed to Join computer($env:COMPUTERNAME) to Domain: $DomainName"
# Clean up credentials so that they don't leak outside this script
$JoinCred = $null
exit 1
}
}
end {
# Clean up credentials so that they don't leak outside this script
$JoinCred = $null
Write-Output "Completed Join Domain"
}
Acesse mais de 300 scripts no NinjaOne Dojo
Detalhamento
O script começa com metadados abrangentes, descrevendo sua finalidade, exemplos de uso e resultados esperados. A lógica central segue um layout de função padrão do PowerShell: início, processo e fim.
- Parâmetros: Essas são entradas fornecidas pelo usuário, incluindo DomainName, UserName, Password e Server. Um parâmetro de switch chamado NoRestart permite que os usuários decidam se desejam que o computador seja reiniciado após ingressar no domínio.
- Início do bloco: Esta seção inicializa o script. Ele define uma função Join-ComputerToDomainPS2 e converte o nome de usuário e a senha fornecidos em um objeto de credencial seguro, pronto para ser usado no processo de associação.
- Bloco de processo: A lógica central reside aqui. Dependendo dos parâmetros fornecidos, o script ingressará o computador no domínio com ou sem uma reinicialização. Ele usa dois comandos principais do PowerShell: Add-Computer e uma função definida pelo usuário. Se ocorrer algum erro durante esse processo, ele será detectado e relatado.
- Bloco final: Isso finaliza o script, limpando todas as credenciais usadas durante sua execução.
Casos de uso em potencial
Estudo de caso: Imagine um MSP que cuida da TI de várias pequenas empresas. Eles acabaram de implantar 50 novas máquinas e precisam que todas elas estejam no domínio da empresa até o início dos negócios no dia seguinte. Usando o script, o MSP insere rapidamente os detalhes necessários de todas as máquinas. Em minutos, todos os computadores são configurados, sem a necessidade de configurações manuais ou demoradas.
Comparações
Os métodos tradicionais de ingressar um computador em um domínio envolvem etapas manuais por meio da interface do Windows ou o uso de scripts legados. Esses métodos podem ser demorados, propensos a erros e não são bem dimensionados para grandes implementações. Nossa abordagem do PowerShell é mais eficiente, menos propensa a erros e é dimensionada para lidar com várias máquinas.
Implicações
O ingresso incorreto em domínios ou a exposição de credenciais podem ser prejudiciais à segurança de TI. Se um computador ingressar no domínio errado, ele poderá acessar recursos não autorizados ou ficar exposto a riscos de segurança.
Recomendações
- Sempre valide os detalhes do domínio antes da execução.
- Proteja e rotacione regularmente as credenciais de domínio.
- Teste o script em um ambiente controlado antes de implementá-lo.
Considerações finais
Em uma época em que a automação reina suprema, ferramentas como esse script, combinadas com plataformas como o NinjaOne, podem aumentar a eficiência, a segurança e a capacidade de gerenciamento. O NinjaOne, em particular, oferece recursos robustos de monitoramento e gerenciamento, garantindo que, uma vez que os computadores sejam adicionados ao domínio, eles permaneçam em conformidade, seguros e otimizados para desempenho.