Назад | Перейти на главную страницу

Почему я не могу использовать ресурс DSC в режиме отправки из модуля, установленного в моем пути к модулю пользователя?

У меня есть собственный ресурс Powershell DSC, встроенный в модуль. Полный код доступна здесь если вы хотите его увидеть, но в этом нет необходимости; Моя проблема не в написанном мной коде (я думаю), а в том, как получить к нему доступ.

В моем случае я использую режим DSC Push Mode. Есть обычный сценарий Powershell, который я использую для установки необходимых модулей, компиляции конфигурации и запуска. В этом скрипте я добавляю местоположение моего модуля в $env:PSModulePath. После этого я могу увидеть модуль и импортировать его в свою интерактивную оболочку следующим образом:

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

Итак, я создаю тестовый файл конфигурации:

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

    }
}

И я стараюсь этим пользоваться:

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

Кажется, что компиляция MOF работает, но на самом деле запуск конфигурации не выполняется:

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

Что могло вызвать это?

  1. Я убедился, что есть только один копия модуля во всех папках в моем $env:PSModulePath.
  2. Кажется, что-то работает; он может определить правильную версию моего модуля в сообщении об ошибке (и когда я меняю версию в своем модуле .psd1 файл, версия, указанная в сообщении об ошибке, также изменится)
  3. Я не верю, что это связано с Почему DSC не может найти установленный ресурс? потому что я использую режим push, и проблем с версией модуля нет.
  4. Может быть, это связано с нестандартной записью в $env:PSModulePath? Я пробовал скопировать модуль в $env:ProgramFiles\WindowsPowershell\Modules, но затем я получаю сообщение об ошибке. действительно не понимаю: Importing module cWinTrialLab failed with error - File C:\Program Files\WindowsPowerShell\Modules\cWinTrialLab\cWtlShortcut\cWtlShortcut.psm1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies. Для записи:

    PS> Get-ExecutionPolicy -List
            Scope ExecutionPolicy
            ----- ---------------
    MachinePolicy       Undefined
       UserPolicy       Undefined
          Process       Undefined
      CurrentUser    Unrestricted
     LocalMachine    Unrestricted
    
  5. Может быть, что-то не так с моей компоновкой каталога? Я на самом деле не видел в дикой природе примера модуля, содержащего несколько ресурсов DSC на основе классов, поэтому я как бы догадываюсь о макете.
  6. (Если есть пример такого модуля - один модуль, содержащий несколько ресурсов DSC на основе классов - ссылка на него будет действительно полезна.)

Наконец, я использую Powershell 5.1 в Windows 10 со всеми обновлениями, применяемыми из Центра обновления Windows. (В конечном итоге я разверну свою конфигурацию на машине Server 2016.)

Что еще я мог упустить?

Обработка конфигурации DSC выполняется под системной учетной записью и поэтому не выполняет поиск по PSModulePath конкретного пользователя. Поместите модуль в одно из стандартных мест, обычно под $env:ProgramFiles\WindowsPowerShell\Modules.

Когда вы говорите, что изменили свой $env:PSModulePath, Я предполагаю, что вы сделали это для своего текущего пользователя, а не изменили настройки для всей машины.

Если вам нужен ресурс, чтобы иметь доступ к ресурсам, доступным конкретному пользователю, некоторые из них позволят передавать объекты учетных данных в качестве параметров для ресурса.