PowerShell:安全な文字列を使用した自動参加ドメイン - 「暗号化キー」の使用法


1

私は75台のコンピューターのラボを管理しているエンタープライズ環境で働いています。私はGhostを使ってイメージを作成し、その後コンピュータを歩き回ってPCの名前とSIDを変更します。

私は自動的にドメインにコンピュータを追加するためのスクリプトを実装していますが、私はPowerShellに慣れていないので本当に助けに感謝します。これが私が使っているスクリプトです、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

私はスタートアップフォルダに置いたバッチファイルを使ってこのスクリプトを実行します。

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

このスクリプトを実行すると正常に動作し、資格情報ファイルを作成し、資格情報ファイルを読み取り、ドメインに参加します。ゴーストとウォーキングの後にこのスクリプトを実行してもうまくいきません、私はエラーが出ます:

    Key not valid for use in specified state.

これはコンピュータが何かが変わったことを知っているからだと思います。最初に資格情報を作成したときと同じユーザーアカウントを使用してドメインに追加しているので、SIDが変更されたため、コンピューターはこれらの資格情報を拒否していると考えます。

私はオンラインで私がこのエラーを回避することを可能にする標準の暗号化キーを設定するために[-key Byte []]を使うことができると読んだ。 PowerShellの使い方がわからないので、手助けをしてもらえますか。

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

スタックオーバーフローの質問 - https://stackoverflow.com/questions/32258829/powershell-secure-tring-encryption-key-usage-join-domain-script

回答:


0

以下をスクリプトに貼り付けます。鉱山を「Custom-ZTIDomainJoin.ps1」と呼びます

%SCRIPTROOT%に配置します

[CmdletBinding()]

パラム (
[パラメータ(必須= $ True)]         $ドメイン、

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

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

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

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

画面をクリアする

Clear-Host

デフォルトのアクション設定を定義する

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

ASCII文字を定義する

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

作業ディレクトリを設定する

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

"/ Log"スイッチが存在する場合、スクリプト出力のログ記録を開始します。

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

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")

関数を定義する

#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
        }

スクリプトがMicrosoft Deployment Toolkitタスクシーケンス内で実行されている場合は、次の手順を実行します。

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")        
            }
   }                    

スクリプトがMicrosoft Deployment Toolkitタスクシーケンス内で実行されていない場合は、次の手順を実行します。

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")
    }

"/ Log"スイッチが存在する場合、スクリプト出力のログ記録を停止します

変数の取得Out-GridView -Title "$ ScriptName.ps1から収集した変数" - 待機

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.