Где Powershell DSC находит код модуля?

Я обнаружил ошибку в модуле архива DSC (MSFT_ArchiveResource.psm1). Скопировав код, отладив его в ISE и выяснив две строки, которые необходимо исправить, я хочу внести изменения в реальный файл и протестировать его с помощью Puppet и модуля msutter/dsc, который использует ресурс архива. .

Я нашел место, где, по моему мнению, находился файл на моей машине:

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\DSCResources\MSFT_ArchiveResource\MSFT_ArchiveResource.psm1

Однако когда я запускаю Puppet, становится ясно, что мой измененный код не выполняется. (Если я установлю $Debug = $true в начале файла, я не увижу дополнительный вывод.) Есть ли какой-то кеш Windows, в котором хранится этот файл, который я должен очистить? Он загружается из ZIP или другого архива?

Я сомневаюсь, что Puppet имеет отношение к этой проблеме, но упомяните об этом на всякий случай. (Я изменил код только на агенте.)

ОБНОВЛЕНИЕ:

Когда я запускаю следующую строку в Powershell, я не нахожу ни одного процесса с ожидаемым именем, содержащим «dsccore»:

Get-WmiObject msft_providers | select -ExpandProperty provider

Полученные результаты:

RegistryEventProvider
PolicyAgentInstanceProvider
CIMWin32
Msft_ProviderSubSystem
SCM Event Provider
Win32_WIN32_TERMINALSERVICE_Prov
WmiPerfClass
WmiPerfClass
WmiPerfInst
WmiPerfInst

person Paul Chernoch    schedule 22.04.2015    source источник


Ответы (2)


Устранение неполадок DSC

Мои ресурсы не обновляются: Как сбросить кеш

Механизм DSC кэширует ресурсы, реализованные в виде модуля PowerShell, для повышения эффективности. Однако это может вызвать проблемы при одновременном создании ресурса и его тестировании, поскольку DSC будет загружать кэшированную версию до тех пор, пока процесс не будет перезапущен. Единственный способ заставить DSC загрузить более новую версию — это явно убить процесс, в котором находится механизм DSC.

Чтобы определить, в каком процессе размещен механизм DSC, и остановить его для каждого экземпляра, вы можете указать идентификатор процесса WmiPrvSE, на котором размещен механизм DSC. Затем, чтобы обновить поставщика, остановите процесс WmiPrvSE с помощью приведенных ниже команд, а затем снова запустите Start-DscConfiguration.

###
### find the process that is hosting the DSC engine
###
$dscProcessID = Get-WmiObject msft_providers | 
Where-Object {$_.provider -like 'dsccore'} | 
Select-Object -ExpandProperty HostProcessIdentifier 

###
### Stop the process
###
Get-Process -Id $dscProcessID | Stop-Process
person briantist    schedule 22.04.2015
comment
Совет, который вы даете, я нашел на этой странице: technet.microsoft.com/en- нас/библиотека/dn249926.aspx - person Paul Chernoch; 22.04.2015
comment
Да, я уже связал это (щелкните заголовок DSC «Устранение неполадок» в моем ответе), и поэтому я использовал теги кавычек. - person briantist; 22.04.2015
comment
Когда я выполняю первую строку, я не получаю идентификатор процесса. Я вижу много процессов WmiPrvSE.exe в диспетчере задач, но не знаю, какой из них для DSC. - person Paul Chernoch; 22.04.2015
comment
Единственное, что сработало, это перезагрузка компьютера. Я надеялся найти решение, которое работает быстро и не требует перезагрузки. - person Paul Chernoch; 22.04.2015

В WMF 5.0 DSC добавлена ​​возможность принудительного импорта модулей без остановки процесса. Он задокументирован на MSDN здесь.

Вот пример того, как его включить:

configuration settings
{
    LocalConfigurationManager
    {
        DebugMode = 'ForceModuleImport'
    }
}

$outputPath = "$env:temp\lcmSettings"

settings -outputPath $outputPath
Set-DscLocalConfigurationManager -Path $outputPath -Force -Verbose
person TravisEz13    schedule 13.05.2016