Por que não consigo usar um recurso DSC no modo push de um módulo que está instalado no caminho do módulo do meu usuário?

4

Eu tenho um recurso personalizado DSC do Powershell, incorporado em um módulo. O código completo é disponível aqui se você quiser vê-lo, mas isso pode não ser necessário; meu problema não é (eu acho) no código que escrevi, mas em como acessá-lo.

No meu caso, estou usando o DSC Push Mode. Há um script Powershell normal que eu uso para instalar os módulos necessários, compilar a configuração e iniciá-lo. Nesse script, adiciono a localização do meu módulo a $env:PSModulePath . Depois de fazer isso, posso ver o módulo e importá-lo no meu shell interativo assim:

PS> Get-Module -ListAvailable | Where-Object -Property Name -eq cWinTrialLab | Import-Module
PS> Get-DscResource -Module cWinTrialLab

ImplementedAs   Name                      ModuleName                     Version    Properties
-------------   ----                      ----------                     -------    ----------
PowerShell      cWtlShortcut              cWinTrialLab                   0.0.1      {Ensure, ShortcutPath, TargetPath, DependsOn...}

Então eu crio um arquivo de configuração de teste:

Configuration TestConfig {

    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName cWinTrialLab

    Node localhost {

        cWtlShortcut "TestShortcut" {
            Ensure = "Present"
            ShortcutPath = "$env:USERPROFILE\Desktop\TestShortcut.lnk"
            TargetPath = "C:\Windows\system32\cmd.exe"
        }

    }
}

E eu tento usá-lo:

PS> . .\testDscConfig.ps1
PS> TestConfig
PS> Start-DscConfiguration -Wait -Force TestConfig

A compilação do MOF parece funcionar, mas, na verdade, a inicialização da configuração falha com:

The PowerShell DSC resource cWtlShortcut from module <cWinTrialLab,0.0.1> does not exist at the PowerShell module path nor is it registered as a WMI DSC resource.
At $Home\Documents\psyops\submod\wintriallab\azure\test.ps1:13 char:1
+ Start-DscConfiguration -Wait -Force TestConfig
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : DscResourceNotFound
    + PSComputerName        : localhost

O que poderia causar isso?

  1. Certifiquei-me de que existe apenas uma cópia do módulo em todas as pastas no meu $env:PSModulePath .
  2. Algo parece estar funcionando; ele pode determinar a versão correta do meu módulo na mensagem de erro (e quando eu alterar a versão no arquivo .psd1 do meu módulo, a versão relatada na mensagem de erro também muda)
  3. Não acredito que esteja relacionado a Por que o DSC não pode encontrar um recurso que está instalado? porque estou usando o modo push e não há problemas de versão de módulo.
  4. Poderia estar relacionado a uma entrada não padrão em $env:PSModulePath ? Eu tentei copiar o módulo para $env:ProgramFiles\WindowsPowershell\Modules , mas então eu recebo um erro que eu realmente não entendo: %código%. Para o registro:

    PS> Get-ExecutionPolicy -List
            Scope ExecutionPolicy
            ----- ---------------
    MachinePolicy       Undefined
       UserPolicy       Undefined
          Process       Undefined
      CurrentUser    Unrestricted
     LocalMachine    Unrestricted
    
  5. Talvez seja algo errado com o layout do meu diretório? Na verdade, eu não vi um exemplo de um módulo contendo vários recursos de DSC baseados em classes, então estou adivinhando o layout.
  6. (Se houver um exemplo desse tipo de módulo - um único módulo, contendo vários recursos DSC baseados em classe - um link para ele seria realmente útil.)

Finalmente, estou usando o Powershell 5.1 no Windows 10 com todas as atualizações aplicadas do Windows Update. (Por fim, implantarei minha configuração em uma máquina do Server 2016).

O que mais eu poderia estar sentindo falta?

    
por Micah R Ledbetter 12.09.2017 / 03:04

1 resposta

2

O processamento da configuração do DSC é executado em uma conta do sistema e, portanto, não está pesquisando o PSModulePath de um usuário específico. Coloque o módulo em um dos locais padrão, normalmente em $env:ProgramFiles\WindowsPowerShell\Modules .

Quando você diz que modificou seu $env:PSModulePath , presumo que tenha feito isso para o usuário atual, em vez de modificar uma configuração ampla da máquina.

Se você precisar que o recurso tenha acesso a recursos disponíveis para um usuário específico, alguns permitirão a passagem de objetos de credenciais como parâmetros para o recurso.

    
por 13.09.2017 / 03:01