PowerShell: Unión automática de dominio con cadena segura - Uso de 'clave de cifrado'

1

Trabajo en un entorno empresarial, donde administro un laboratorio de 75 computadoras. Uso Ghost para crear imágenes y luego camino por las computadoras para cambiar los nombres de PC y los SID.

Estoy implementando un script para agregar automáticamente las computadoras al dominio, pero soy nuevo en PowerShell y realmente agradecería la ayuda. Aquí está el script que estoy usando, 1.ps1:

    Param (
    [String]$User = $(Throw "MYDOMAINUSERINFO"),
     [String]$Domain = "MYDOMAININFO",
     [String]$PathToCred = "C:\OMC\AutoPost"
     ) 

    #Make sure our path string has a trailing backslash
    If ($PathToCred[$PathToCred.Length - 1] -ne "\")
    {    $PathToCred += "\"
    }

    #Now create file string
    $File = $PathToCred + "JoinDomain-$User.crd"

    #And find out if it's there, if not create it
    If (-not (Test-Path $File))
    {    (Get-Credential).Password | ConvertFrom-SecureString | Set-Content $File
    }

    #Load the credential file
    $Password = Get-Content $File | ConvertTo-SecureString
    $Credential = New-Object System.Management.Automation.PsCredential($User,$Password)

    #Add the computer to the domain
    Add-Computer -DomainName $Domain -Credential $Credential

Ejecuto este script usando un archivo por lotes que coloco en la carpeta de inicio.

   Powershell.exe -ExecutionPolicy Bypass C:\OMC\AutoPost\1.ps1 -User MYDOMAINUSERINFO -Domain MYDOMAININFO -PathToCred C:\OMC\AutoPost\

La ejecución de este script funciona normalmente, crea un archivo de credenciales, lee el archivo de credenciales y se une al dominio. Ejecutar este script después de fantasmas y caminar no funciona, me sale el error:

    Key not valid for use in specified state.

Creo que esto se debe a que la computadora sabe que algo ha cambiado. Estoy usando la misma cuenta de usuario para agregar al dominio con el que construí las credenciales inicialmente, así que creo que la computadora está rechazando estas credenciales porque el SID ha cambiado.

Leí en línea que puedo usar [-key Byte []] para establecer una clave de cifrado estándar, lo que me permitirá evitar este error. Soy demasiado nuevo en PowerShell para saber cómo usar esto, ¿alguien puede ayudarme?

    More info:
    https://technet.microsoft.com/en-us/library/hh849814.aspx
    http://ss64.com/ps/convertfrom-securestring.html

Pregunta de desbordamiento de pila: https://stackoverflow.com/questions/32258829/powershell-secure-string-encryption-key-usage-join-domain-script

Steven Militello
fuente

Respuestas:

0

Pegue lo siguiente en un script. Llamo a las minas "Custom-ZTIDomainJoin.ps1"

Lo coloco en% SCRIPTROOT%

[CmdletBinding ()]

Param (
[Parámetro (obligatorio = $ True)] $ Domain,

[Parameter(Mandatory=$True)]
    $UserName,

[Parameter(Mandatory=$True)]
    $Password,

[Parameter(Mandatory=$False)]
    $OU,

[Parameter(Mandatory=$False)]   
    [Switch]$Log

)

Borrar la pantalla

Clear-Host

Definir preferencias de acción predeterminadas

$DebugPreference = "Continue"
$ErrorActionPreference = "Continue"
$WarningPreference = "Continue"

Definir caracteres ASCII

$Equals = [char]61
$Space = [char]32
$SingleQuote = [char]39
$DoubleQuote = [char]34
$NewLine = "`n"

Establecer directorio de trabajo

$ScriptDir =  $MyInvocation.MyCommand.Definition | Split-Path -Parent
$ScriptName = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
$Temp = "$Env:LocalAppData\Temp"

Comience a registrar la salida del script si está presente el modificador "/ Log"

If ($Log.IsPresent) {(Start-Transcript -Path "$Temp\$ScriptName.log")}

Consulta WMI

$HostName = (Get-WmiObject -Class Win32_ComputerSystem -Property Name | Select -ExpandProperty Name).Trim().ToUpper()
$OSArchitecture = (Get-WmiObject -Class Win32_OperatingSystem -Property OSArchitecture | Select -ExpandProperty OSArchitecture).Replace("-bit", "").Replace("32", "86").Insert(0,"x").ToUpper()
$OSVersion_Major = ([Environment]::OSVersion.Version.Major)
$OSVersion_Minor = ([Environment]::OSVersion.Version.Minor)
[Decimal]$OSVersion = ("$OSVersion_Major" + "." + "$OSVersion_Minor")

Definir funciones

#Encode a plain text string to a Base64 string  
    Function ConvertTo-Base64 ($String) 
        { 
            $Encoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($String))
            Return $Encoded  
        }   

#Decode an Base64 string to a plain text string
    Function ConvertFrom-Base64 ($String) 
        { 
            $Decoded = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($String))
            Return $Decoded
        }

Si el script se ejecuta dentro de una secuencia de tareas de Microsoft Deployment Toolkit, realice los siguientes pasos

If (Test-Path -Path TSEnv: -ErrorAction SilentlyContinue)

    {           
        If ($OSVersion -lt "10.0")

            {
                #MDT passes in sensitive values as Base64 encoded strings, so they MUST be decoded to plain text first
                    $Domain = ConvertFrom-Base64 -String "$Domain"
                    $UserName = ConvertFrom-Base64 -String "$UserName"
                    $Password = ConvertFrom-Base64 -String "$Password" | ConvertTo-SecureString -AsPlainText -Force
                    $OU = $TSEnv:MachineObjectOU

                #Create Credential Object For Active Directory Operations
                    $Credentials = (New-Object System.Management.Automation.PSCredential("$Domain\$UserName", $Password))

                #Join the specified Active Directory Domain
                    $Device_JoinDomain = (Add-Computer -DomainName $Domain -Credential $Credentials -Force -Verbose)

                #Wait 15 Seconds
                    (Start-Sleep -Seconds "15")
            }

        ElseIf ($OSVersion -ge "10.0")

            {
                #MDT passes in sensitive values as Base64 encoded strings, so they MUST be decoded to plain text first
                    $Password = (ConvertTo-SecureString -String "$Password" -AsPlainText -Force)
                    $OU = $TSEnv:MachineObjectOU

                #Create Credential Object For Active Directory Operations
                    $Credentials = (New-Object System.Management.Automation.PSCredential("$Domain\$UserName", $Password))

                #Join the specified Active Directory Domain
                    $Device_JoinDomain = (Add-Computer -DomainName $Domain -Credential $Credentials -Force -Verbose)

                #Wait 15 Seconds
                    (Start-Sleep -Seconds "15")        
            }
   }                    

Si el script NO se ejecuta dentro de una secuencia de tareas de Microsoft Deployment Toolkit, realice los siguientes pasos

ElseIf (!(Test-Path -Path TSEnv: -ErrorAction SilentlyContinue))

    {
        #Convert the password to a Secure String
            $Password = (ConvertTo-SecureString -String "$Password" -AsPlainText -Force)            

        #Create Credential Object For Active Directory Operations
            $Credentials = (New-Object System.Management.Automation.PSCredential("$Domain\$UserName", $Password))

        #Join the specified Active Directory Domain
            $Device_JoinDomain = (Add-Computer -DomainName $Domain -Credential $Credentials -Force -Verbose)

        #Wait 15 Seconds
            (Start-Sleep -Seconds "15")
    }

Deje de registrar la salida del script si está presente el modificador "/ Log"

Get-Variable | Out-GridView -Title "Variables recopiladas de $ ScriptName.ps1" -Wait

If ($ Log.IsPresent) {(Stop-Transcript)}

FreedByGrace
fuente