Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vhdFile not copying from host to vhdx file #212

Open
mvthul opened this issue Oct 12, 2023 · 0 comments
Open

vhdFile not copying from host to vhdx file #212

mvthul opened this issue Oct 12, 2023 · 0 comments

Comments

@mvthul
Copy link

mvthul commented Oct 12, 2023

Problem description

Seems that files are not copied to vhdx
I got a vhdx with windows server already installed on it.

When i run the DSC configuration seems okee but files are not found on the VHDX

Resources to be copied are located on Hyper v host C:\DSCConfigs
Need to be copied inside VHDX C:\Temp

Verbose logs

VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendConfigurationApply,'className' =
MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer HOST01 with user sid S-1-5-21-3317971597-1648635444-1937067796-500.
VERBOSE: [HOST01]: LCM:  [ Start  Set      ]
VERBOSE: [HOST01]: LCM:  [ Start  Resource ]  [[VhdFile]FileCopy]
VERBOSE: [HOST01]: LCM:  [ Start  Test     ]  [[VhdFile]FileCopy]
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Alias
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] C
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Cert
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] D
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Env
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Function
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] HKCU
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] HKLM
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Variable
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] WSMan
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] :\
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] SourcePath => C:\DSCConfigs\*
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Type => Directory
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Ensure => False
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Content =>
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] DestinationPath => C:\Temp
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Force => True
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Attributes =>
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Recurse => True
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Testing the file with relative VHD destination C:\Temp
VERBOSE: [HOST01]:                            [[VhdFile]FileCopy] Test returned True
VERBOSE: [HOST01]: LCM:  [ End    Test     ]  [[VhdFile]FileCopy]  in 0.8860 seconds.
VERBOSE: [HOST01]: LCM:  [ Skip   Set      ]  [[VhdFile]FileCopy]
VERBOSE: [HOST01]: LCM:  [ End    Resource ]  [[VhdFile]FileCopy]
VERBOSE: [HOST01]: LCM:  [ End    Set      ]
VERBOSE: [HOST01]: LCM:  [ End    Set      ]    in  1.0770 seconds.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 1.107 seconds

DSC configuration

<#
    .DESCRIPTION
        Not yet written.
#>
Configuration Example
{
    param
    (
        [Parameter()]
        $vhdPath = 'D:\VMDisks\VM-DC01-Disk.vhdx',

        [Parameter()]
        $itemToCopy = 'C:\DSCConfigs\*',

        [Parameter()]
        $relativeDestinationPath = 'C:\Temp'
    )

    Import-DscResource -ModuleName 'HyperVDsc'

    VhdFile FileCopy
    {
        VhdPath       = $vhdPath
        FileDirectory = DSC_FileDirectory
        {
            SourcePath      = $itemToCopy
            DestinationPath = $relativeDestinationPath
            Force = $true
            Type = 'Directory'
            Recurse = $true
        }
    }
}

Example

Suggested solution

Working copy to vhdx to function to eventualy do:

`Configuration VM-DC01
{
param
(
[Parameter()]
$VirtualHardDiskPath = 'D:\VMDisks\disk.vhdx',

    [Parameter()]
    $VirtualMachinePath = 'D:\VMs',

    [Parameter()]
    $VirtualMachineTemplate = 'D:\ISO\template.vhdx',
    
    [Parameter()]
    $Name = 'VM-DC01-Disk'
)

Import-DscResource -ModuleName xPendingReboot
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName ComputerManagementDsc 
Import-DscResource -ModuleName CertificateDsc 
Import-DscResource -ModuleName NetworkingDsc 
Import-DscResource -ModuleName HyperVDsc
Import-DscResource -ModuleName xHyper-V

Node localhost
{
    # Configure LCM to allow Windows to automatically reboot if needed. Note: NOT recommended for production!
    LocalConfigurationManager
    {
        # Set this to $true to automatically reboot the node after a configuration that requires reboot is applied. Otherwise, you will have to manually reboot the node for any configuration that requires it. The default (recommended for PRODUCTION servers) value is $false.
        RebootNodeIfNeeded = $true
        # The thumbprint of a certificate used to secure credentials passed in a configuration.
        CertificateId = $node.Thumbprint
    }

    # Install Windows Feature "Hyper-V Services".
    WindowsFeature HyperV
    {
        Ensure = 'Present'
        Name   = 'Hyper-V'
    }

    WindowsFeature HyperVPowerShell
    {
        Ensure = 'Present'
        Name   = 'Hyper-V-PowerShell'
    }

    # Dynamically build the 'DependsOn' array for the 'VMHyperV' feature
    # based on the number of virtual switches specified
    $VMHyperVDependsOn = @('[WindowsFeature]HyperV','[WindowsFeature]HyperVPowerShell')
    
    # Create a switch to be used by the VM
    VMSwitch switch
    {
        Name   = 'Test-Switch'
        Ensure = 'Present'
        Type   = 'Internal'
    }

    # Create new VHD file.
    File NewVHD1
    {
       SourcePath = $VirtualMachineTemplate
       DestinationPath = Join-path (Split-Path $VirtualHardDiskPath) "$name.vhdx"
       Type = 'File'
       Ensure = 'Present'
    }

    #Vhd NewVHD1
    #{
    #    Ensure     = 'Present'
    #    Name       = $name
    #    Path       = (Split-Path $VirtualHardDiskPath)
    #    Generation = 'Vhdx'
    #    ParentPath = $VirtualHardDiskPath
    #}

    # Customize VHD by copying a folders/files to the VHD before a VM can be created
    # Example below shows copying unattended.xml before a VM can be created
    VhdFile CopyDSCConfigPFX
    {
        VhdPath       = Join-path (Split-Path $VirtualHardDiskPath) "$name.vhdx"
        FileDirectory =  @(

            # Pending.mof
            DSC_FileDirectory {
                SourcePath = 'C:\DSCConfigs\HADC\DC01\Localhost.mof'
                DestinationPath = "Temp\Pending.mof"
                Ensure = 'Present'
            }

            # meta.mof
            DSC_FileDirectory {
                SourcePath = 'C:\DSCConfigs\HADC\DC01\localhost.meta.mof'
                DestinationPath = "Windows\System32\Configuration\MetaConfig.mof"
                Type = 'File'
                Ensure = 'Present'
            }

            # xPFX
            DSC_FileDirectory {
                SourcePath = 'C:\DSCConfigs\PFX'
                DestinationPath = "DSCConfigs\PFX" 
                type    = 'Directory'
                Recurse = $True
                Ensure = 'Present'
            }

            # xModules
            DSC_FileDirectory {
                SourcePath = 'C:\DSCConfigs\Modules'
                DestinationPath = "DSCConfigs\Modules" 
                type    = 'Directory'
                Recurse = $True
                Ensure = 'Present'
            }
          )
          DependsOn = '[File]NewVHD1'
       }

    # create the testVM out of the vhd.
    VMHyperV TestVM
    {
        Name            = "$($name)_vm"
        SwitchName      = 'Test-Switch'
        VhdPath         = Join-path (Split-Path $VirtualHardDiskPath) "$name.vhdx"
        Path            = "$VirtualMachinePath" + "\" + "$($name)_vm" 
        ProcessorCount  = 2
        MaximumMemory   = 4GB
        MinimumMemory   = 1GB
        RestartIfNeeded = $true
        DependsOn       = '[VMSwitch]switch', '[File]NewVHD1', '[VhdFile]CopyDSCConfigPFX'
        State           = 'Running'
        Generation      = '2'
        SecureBoot      = $true 

    }
       
}

}`

Operating system the target node is running

Server 2022 standalone

PowerShell version and build the target node is running

Latest

HyperVDsc version

Latest
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant