Почему для ресурса файла конфигурации желаемого состояния работают учетные данные, а PsDscRunAsCredential — нет?

Я пытаюсь научиться использовать учетные данные с конфигурацией желаемого состояния PowerShell, и я не могу понять разницу между атрибутами Credential и PsDscRunAsCredential ресурса.

В качестве простого тестового примера я пытаюсь скопировать папку и ее содержимое из общей папки в локальную папку на целевом узле. Учетная запись компьютера целевого узла не имеет доступа к общему ресурсу, поэтому я предоставляю учетные данные, у которых есть доступ. Если я назначу учетные данные атрибуту Credential ресурса File, это сработает. Если я использую атрибут PsDscRunAsCredential, я получаю сообщение об ошибке «Отказано в доступе» при попытке доступа к общей папке.

Configuration FileWithCredential {

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node $AllNodes.NodeName {

        # copy files from a file share to a new folder on the target node
        File CopyFileShareFolder {
            Ensure = 'Present'
            Type = 'Directory'
            Recurse = $true
            SourcePath = '\\fileshare\folder\subfolder\stuff_I_want_to_copy'
            DestinationPath = 'c:\ps\DSC\filesharedestination'
            # If I use Credential instead of PsDscRunAsCredential, it works
            # Credential = Get-Credential -UserName ourdomain\myaccout -Message 'Enter Password'
            PsDscRunAsCredential = Get-Credential -UserName ourdomain\myaccout -Message 'Enter Password'
        }
    }
}

$ConfigData = @{
    AllNodes = @(
        @{
            NodeName = 'target-server'
            PsDscAllowDomainUser = $true
            PsDscAllowPlainTextPassword = $true
        }
    )
}

Я компилирую MOF на компьютере с Windows 10 и передаю конфигурацию на сервер Server 2016. Оба работают под управлением PowerShell 5.1.

PS C:\Users\me\Documents\pscode\dsc_test2> FileWithCredential -ConfigurationData $ConfigData
PS C:\Users\me\Documents\pscode\dsc_test2> Start-DscConfiguration .\FileWithCredential\ -Verbose -Wait -Force

Я понимаю, что PsDscRunAsCredential новый, и я предполагаю, что есть причина предпочесть его старому Credential, но я не могу понять, в чем реальные отличия. Взаимозаменяемы ли они в принципе? Если нет, то что мне не хватает, чтобы учетные данные «запуск от имени» работали?

ПРИМЕЧАНИЕ. Я понимаю риск безопасности, связанный с использованием простых текстовых паролей, но сейчас я просто пытаюсь понять, как передавать учетные данные и убедиться, что они работают. Следующим в моем списке стоит научиться делать это безопасно.


person Matt    schedule 04.04.2018    source источник
comment
У меня только что возникла мысль: ресурс File... несколько особенный. Это один из немногих ресурсов, реализованных в двоичном виде. У него есть некоторые странности, такие как отсутствие возврата ModuleName при запуске Get-DscResource. Возможно, это реализовано таким образом, что LCM не может изменить свой контекст. Было бы интересно включить отладку для DSC, а потом ворваться в отладчик и проверьте свой контекст, попробуйте получить доступ к общему ресурсу и локальной файловой системе и т. д.   -  person briantist    schedule 05.04.2018


Ответы (3)


Кажется, моя догадка могла быть верной; превращая мой комментарий в ответ:

У меня только что возникла мысль: ресурс File... несколько особенный. Это один из немногих ресурсов, реализованных в двоичном виде. У него есть некоторые странности, такие как отсутствие возврата ModuleName при запуске Get-DscResource. Возможно, это реализовано таким образом, что LCM не может изменить свой контекст. Было бы интересно включить отладку для DSC, а потом ворваться в отладчик и проверьте свой контекст, попробуйте получить доступ к общему ресурсу и локальной файловой системе и т. д.

При выполнении теста оказывается, что (по какой-то причине) ресурс File просто не поддерживает должным образом PsDscRunAsCredential.

Вот демонстрация с использованием Invoke-DscResource, сравнивающая File с Script и показывающая, что владелец результирующего файла другой.

С File владельцем всегда будет SYSTEM.

С Script владельцем является SYSTEM при запуске без учетных данных (ожидается), но при запуске с учетными данными владелец другой (в моем случае владельцем стала локальная группа Administrators, потому что учетные данные, которые я предоставил, являются локальным администратором) .

$cred = Get-Credential

$module = 'PsDesiredStateConfiguration'

$fprop = @{
    DestinationPath = "$env:USERPROFILE\delme.txt"
    Contents = "Hello"
}

$sprop = @{
    GetScript = { @{} }
    TestScript = { $false }
    SetScript = [ScriptBlock]::Create("'Hello'|sc '$env:USERPROFILE\delme.txt'")
}

$cprop = @{ PsDscRunAsCredential = $cred }

function Assert-FileTest { Get-Item -LiteralPath $fprop.DestinationPath | % { $_.GetAccessControl().Owner | Write-Verbose -Verbose ; $_ } | Remove-Item -Force }

Invoke-DscResource -Name File -ModuleName $module -Method Set -Property $fprop -Verbose
Assert-FileTest

Invoke-DscResource -Name File -ModuleName $module -Method Set -Property ($fprop + $cprop) -Verbose
Assert-FileTest


Invoke-DscResource -Name Script -ModuleName $module -Method Set -Property $sprop -Verbose
Assert-FileTest

Invoke-DscResource -Name Script -ModuleName $module -Method Set -Property ($sprop + $cprop) -Verbose
Assert-FileTest
person briantist    schedule 05.04.2018

@briantist правильно указывает, что файл - это ресурс особого типа... он реализован на C ++ как ресурс WMI. Остальные встроенные ресурсы реализованы в PowerShell (за исключением журнала, который реализован внутри самого механизма DSC).

Ресурсы WMI не приобрели популярности, и File — единственный ресурс, реализованный таким образом.

PsDscRunAsCredential был реализован для ресурсов PowerShell, но не для ресурсов WMI. Вот почему он не работает для File.

Кроме того, свойство Credential объекта File более ограничено, чем PsDscRunAsCredential: оно используется только для доступа к файлам в сетевой папке.

Я постараюсь добавить эту информацию в нашу документацию. Спасибо, что указали на это.

person Norberto Arrieta    schedule 11.04.2018
comment
Спасибо! Я знал, что где-то читал, что File был реализован как WMI, но я не мог найти никакой документации, подтверждающей это (или даже возможной), поэтому я не включил ее. - person briantist; 14.04.2018
comment
Просто поясню: в настоящее время это означает, что все файлы, созданные ресурсом File в DSC, будут принадлежать SYSTEM, и изменить это невозможно, верно? Есть ли способы обойти это или кто-нибудь реализовал замену ресурса File в PowerShell, которую мы можем использовать вместо этого? - person Fotis Gimian; 07.04.2019

См. статью Учетные данные ConfigData, в частности

Ресурсы конфигурации DSC по умолчанию работают как локальная система. Однако для некоторых ресурсов требуются учетные данные, например, когда ресурсу Package требуется установить программное обеспечение под определенной учетной записью пользователя.

В более ранних ресурсах для этого использовалось жестко заданное имя свойства Credential. В WMF 5.0 добавлено автоматическое свойство PsDscRunAsCredential для всех ресурсов. Сведения об использовании PsDscRunAsCredential см. в разделе Запуск DSC с учетными данными пользователя. Новые ресурсы и пользовательские ресурсы могут использовать это автоматическое свойство вместо создания собственного свойства для учетных данных.

person Bruce Payette    schedule 05.04.2018
comment
Хотя формулировка немного неточна, не так ли? Он говорит, что может использовать это автоматическое свойство, но на самом деле у ресурса нет другого выбора, кроме как работать в этом контексте, поскольку LCM запускает код ресурса в контексте этого пользователя (он может вместо этого принимать учетные данные и использовать их вручную). По крайней мере, так я понимал эту функцию; Я предполагаю, что вы гораздо лучше знаете, будучи в команде. Как/где это ломается? - person briantist; 05.04.2018
comment
Я думаю, что путаница возникает из-за различия между пользователем ресурса, который пишет конфигурации, и разработчиком ресурса, который пишет код, реализующий базовую логику ресурса. Если вы читаете последнюю строку, разработчики ресурсов могут использовать это автоматическое свойство и избежать необходимости реализовывать собственное свойство/логику учетных данных. так понятнее? Другими словами, до введения PsDscRunAsCredential (который реализован в LCM) каждый разработчик ресурсов должен был кодировать свою собственную обработку учетных данных. - person Bruce Payette; 08.04.2018
comment
Вот как я это уже читал; моя точка зрения заключается в том, что, поскольку PsDscRunAsCredential реализовано в LCM, утверждение, что разработчик ресурса использует его, является неправильным (на самом деле разработчик не делает< /i> ничего; на самом деле они не могут отказаться от этого, кроме как взять и использовать другие явные учетные данные). Это также подразумевает, что любой ресурс будет корректно работать с PsDscRunAsUser, даже если он был написан до появления этой функции, но, похоже, это не так, и я подозреваю, что это больше связано с ресурсом File, чем с самой функцией. Что вы думаете о моем ответе? - person briantist; 08.04.2018
comment
@briantist ты прав. File отличается тем, что он реализован как поставщик CIMv2. Это означает, что универсальная модель выполнения вне процесса, используемая RunAs, не может работать. (Это работает только для ресурсов сценария PowerShell.) Я попросил @norbert-arrieta из команды DSC проверить это. Пожалуйста, посмотрите его ответ. Спасибо. - person Bruce Payette; 12.04.2018