2017-06-08 6 views
-1

Hyper-Vの役割がインストールされたスタンドアロン(クラスタ化されていませんが、ドメイン内にあります)のWindows Server 2016があります。 私は毎日VMをクローンする必要があるので、C#とPowerShellを使っていくつかの小さな「もの」を書いています。 VHDのドメインへのHyper-V VMのクローニングと追加

  1. 並列コピー

    public static void Main(string[] args) { 
        var sourceFile = args[0]; 
        var distanationDir = args[1]; 
        int numOfCopies = Int32.Parse(args[2]); 
    
        //var sourceFile = [email protected]"C:\temp\123.VHD"; 
        //var distanationDir = [email protected]"C:\temp\vhds\"; 
        //int numOfCopies = 15; 
    
        StartJob(sourceFile, distanationDir, numOfCopies, random); 
    } 
    
    private static void StartJob(string sourcefile, string distanationdir, int numOfCopies, Random random) { 
        int count = 0; 
        Parallel.For(0, numOfCopies, i => { 
         Console.WriteLine("i = {0}, thread = {1}", i, Thread.CurrentThread.ManagedThreadId); 
    
         try { 
          string atrib = Path.GetExtension(sourcefile); 
          string guid = Guid.NewGuid().ToString("N"); 
          var copyNew = Path.GetFileNameWithoutExtension(sourcefile) + guid + atrib; 
          File.Copy(sourcefile, Path.Combine(distanationdir + '\\', copyNew)); 
          Console.WriteLine(@"Started{copyNew}"); 
         } catch (IOException copyError) { 
          Console.WriteLine(copyError.Message); 
         } 
        } 
    } 
    
  2. 第2のステップは、既存のVHDXでVMを作成し、このPowerShellスクリプトでVMを作成することです。

    $from = 81 
    $howmany = 30 
    
    $files = Get-ChildItem -Path "E:\Hyper-v" -Filter *.vhdx 
    if ($files) { 
        Write-Host "variable is not null" 
        try { 
         $vmIndex = $from 
         for ($i = 0; $i -lt $howmany; $i++) { 
          Write-Host "Start " 
          New-Vm -Name "AUT-TA$vmIndex" -Path "E:\Hyper-v\Virtual Machines" -MemoryStartupBytes 4294967296 -VHDPath $files[$i].FullName -SwitchName "Broadcom NetXtreme Gigabit Ethernet #4 - Virtual Switch" 
          Write-Host "Vm created " + "AUT-TA$vmIndex" 
          $vmIndex++ 
          Write-Host "End" 
         } 
         exit 
        } catch { 
         [System.Exception]"caught a system exception" 
        } 
    } else { 
        Write-Host "No such files" 
        exit 
    } 
    
  3. 最終私がドメインに参加する必要があるが、私はこのホスト上の各VMの実行していて、ドメインに追加されますいくつかのスクリプトを必要としています。

+1

ご質問はありますか? –

+0

いくつかはこのように思う$ domain = "myDomain" $ password = "myPassword!" | ConvertTo-SecureString -asPlainText -Force $ username = "$ domain \ myUserAccount" $ credential =新規オブジェクトSystem.Management.Automation.PSCredential($ username、$ password) Add-Computer -DomainName $ domain -Credential $ credential 。しかし、サーバーhyper-vを実行して、すべてのVMをドメインに追加することも考えてください。 –

答えて

1

あなたはPowerShellのダイレクトを使用することができるはずですので、あなただけのVMのあなたが実行したい場合、Invoke-Command -VMNameAdd-Computerコマンドを取得することができます。あなたのコメントは、パスワードをスクリプトに保存することを意味します。そのセキュリティの意味を覚えておいてください。

$domain = "myDomain" 
$password = "myPassword!" | ConvertTo-SecureString -asPlainText -Force 
$username = "$domain\myUserAccount" 
$credential = New-Object System.Management.Automation.PSCredential($username,$passwor‌​d) 
Get-VM | ForEach-Object { Invoke-Command -VMName $_.name -ScriptBlock {Add-Computer -DomainName $using:domain -Credential $using:credentia}} 
+0

次のパラメータの値を指定してください: Windows PowerShellでは処理できないエラーが発生しました。リモートセッションが終了している可能性があります。 + CategoryInfo:OpenError:(AUT-TA100:文字列)[]、PSRemotingDataStructureException + FullyQualifiedErrorId:PSSessionStateBroken これは私が受け取るものですし、私が必要とするたびに資格情報 –

+0

@AndreyDzhezhoraを入力して、あなたは '、' $を$のdomain'を変更でしたパスワード '、' $ username'をすべてドメインの値に反映させますか?もしそうなら、それはうまくいくはずです! – FoxDeploy

+0

@FoxDeployはい、間違いありません。 –

0

これは解決策である:それはHyper-Vホストからこの(これのみを実行した後、これは(VHDのクローンまたはコピーする前に)クライアントとサーバーの両方で

Enable-PSRemoting -Force 
winrm set winrm/config/client '@{TrustedHosts="*"}' 

コマンド 実行以下のための1つのVMを追加していますが、それをホスト上の仮想マシンのIPのForEachを作成することができます)

#Local Cred 
$passwordLoc = "Password" 
$usernameLoc = "localhost\Administrator" 
$credentialsLoc = New-Object System.Management.Automation.PsCredential($usernameLoc, (ConvertTo-SecureString $passwordLoc -AsPlainText -Force)) 
$ses = New-PSSession 192.168.90.91 -Credential $credentialsLoc 
##Domain Cred 
$domain = "domain.com" 
$password = "Password" 
$username = "$domain\PowerUser" 
$credentials = New-Object System.Management.Automation.PsCredential($username, (ConvertTo-SecureString $password -AsPlainText -Force)) 
Invoke-command -Session $ses -ScriptBlock { 
Add-Computer -DomainName $using:domain -Credential $using:credentials -ErrorAction Stop 
Rename-Computer -NewName "AUT-TA41" -DomainCredential $using:credentials -Force -ErrorAction Stop 
Restart-Computer -ErrorAction Stop} 

そして、この作品!

関連する問題