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

Копирование PowerShell DSC из общего сетевого ресурса

Я пытаюсь использовать PowerShell DSC для копирования содержимого папки из общего сетевого ресурса. Вот код:

Configuration TestSetup {
    Node localhost {
        File Test {
            SourcePath = "\\Server\SomeShare\SomeFolder"
            DestinationPath = "E:\test"
            Recurse = $true
            Type = "Directory"
        }
    }
}

Однако это не работает - когда я запускаю его, я получаю следующее сообщение об ошибке:

The related file/directory is: \\Server\SomeShare\SomeFolder.
The path cannot point to the root directory or to the root of a net share.
SourcePath must be specified if you want to configure the destination directory recursively. Make sure that SourcePath is a directory and that it is accessible.
    + CategoryInfo          : InvalidArgument: (:) [], CimException
    + FullyQualifiedErrorId : MI RESULT 4
    + PSComputerName        : localhost

The SendConfigurationApply function did not succeed.
    + CategoryInfo          : InvalidArgument: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : MI RESULT 4
    + PSComputerName        : localhost

Я получаю аналогичные результаты при попытке установить пакет из общего сетевого ресурса или извлечь архив из общего сетевого ресурса. Я использую PowerShell 4 на Windows Server 2008 R2 SP1.

Есть ли способ использовать PowerShell DSC с общими сетевыми ресурсами?

Диспетчер локальной конфигурации DSC запускается как локальная учетная запись SYSTEM, а не как ваша учетная запись пользователя. Поэтому он не сможет получить доступ к сетевым ресурсам, если ему не предоставлены явные разрешения.

Возможны две ситуации. Либо общий ресурс находится на том же компьютере, к которому применяется конфигурация DSC (назовем этот компьютер A), либо общий ресурс находится на другом компьютере (назовем этот компьютер B).

Если общий ресурс находится на компьютере A, пользователю SYSTEM необходимо предоставить разрешения READ. Например:

net share SomeShare=C:\SomeShare /GRANT:"NT AUTHORITY\SYSTEM",READ

Если общий ресурс находится на машине B, разрешения READ необходимо предоставить учетной записи компьютера машины A. Например:

net share SomeShare=C:\SomeShare /GRANT:DOMAIN\MachineA$,READ

Источник: http://www.powershellmagazine.com/2013/09/02/copying-powershell-modules-and-custom-dsc-resources-using-dsc/

В DSC работает на localhost чтобы применить конфигурацию. Это означает DSC файлы ресурсов должны быть распределены на каждую машину, которая должна быть настроена через DSC.

Поэтому управление разрешениями имеет решающее значение при копировании файлов DSC из общей папки.

DSC работает под NT AUTHORITY\SYSTEM счет и если Credential установлен атрибут, Computer account используется при извлечении файлов из общего сетевого ресурса.

Поэтому и в зависимости от того, откуда взяты файлы, SYSTEM учетная запись должна быть предоставлена read разрешения на локальный общий ресурс и Computer account необходимо предоставить read разрешения на удаленный общий ресурс.

Это подробно описано в ответе Ричардса, который расширяет синтаксис на исходный источник блога для этой информации.

В настоящий момент у меня нет времени углубляться в это, но похоже, что можно безопасно передать учетные данные для использования Local Configuration Manager. Фактически, в публикации в блоге его пример использует ресурс File для извлечения файлов из общего сетевого ресурса. Я надеюсь попробовать это в ближайшее время, а затем вернусь, чтобы лучше сформулировать этот ответ.

Блог TechNet: Хотите защитить учетные данные в конфигурации желаемого состояния Windows PowerShell? - Трэвис Планк

Powershell почти такой же тупой, как и старая оболочка cmd. Он по-прежнему имеет очень ограниченную поддержку путей UNC. Имея это в виду ... вы пробовали использовать псевдоним UNC-пути? т.е.

New-PSDrive -Name UNCPath -PSProvider FileSystem -Root \\Server\SomeShare\

А затем назовите путь UNCPath:\SomeFolder. Очистка с помощью Remove-PSDrive когда вы закончите.

Также иногда можно указать FileSystem::\\Server\SomeShare\SomeFolder как путь. Я видел случаи, когда это не работало ... но попробовать стоит.