Powershell, наборы параметров именования переключателей

Исходный вопрос - обновление ниже - окончательный код в отмеченном ответе

Надеюсь, более или менее простой вопрос, но мой мозг поджарился. Я пытаюсь написать модуль для установки разрешений раздела реестра с именем «Set-RegistryPermissions», и у меня есть небольшая проблема с присвоением имен моим переключателям и созданием приемлемых наборов параметров. Я придумал следующее, но дошел до последней строки и зашел в тупик.

    # -Recurse                  Sets Permissions for supplied key and subkeys (entire tree)

    # -Inherit                  Sets Inheritance for supplied key
    # -SubkeyInherit            Sets Inheritance for only subkeys (entire subkey tree)

    # -Inherit -Recurse         Sets Inheritance for supplied key and subkeys (entire tree)
    # -SubkeyInherit -Recurse   Sets Permissions for supplied key and Inheritance for subkeys (entire subkey tree)

Чем больше я смотрю на это, тем больше запутываюсь. Может быть, я мог бы объединить -Inherit и -SubkeyInherit вместо -Inherit -Recurse или, может быть, начать снова и иметь что-то вроде SetSuppliedKey, Recurse, Set... Аааа, я снова запутался. Любые предложения, пожалуйста?

---- Обновлять ----

В ответ на комментарий @Scepticalist я придумал следующее, что также позволяет мне добавить «-Permissions -Subkeys».

Я действительно думал, что могу изменить «-Permissions -Recurse» на «-Permissions -All», но это звучит труднее понять, или я мог бы изменить «-Inherit -All» на «-Inherit -Recurse» и отказаться от переключателя -All, но это может сделать последний вариант запутанным, например, вы пытаетесь повторить все разрешения, а также наследовать.

Может быть, я просто слишком много думаю об этом или пытаюсь сделать слишком много в одной команде. Было бы проще, если бы команду запускали дважды, устанавливали разрешения, а затем устанавливали наследование.

Пожалуйста, дайте мне знать ваши мысли, если вы видите какие-либо проблемы или думаете, что это слишком сложно. Спасибо.

# -Permissions (Parameter)
# -Recurse (Switch)
# -Inherit (Switch)
# -Subkeys (Switch)
# -All (Switch)

# -Permissions              Sets Permissions for supplied key
# -Permissions -Subkeys     Sets Permissions for only subkeys (entire subkey tree)
# -Permissions -Recurse     Sets Permissions for supplied key and subkeys (entire tree)

# -Inherit                  Sets Inheritance for supplied key
# -Inherit -Subkeys         Sets Inheritance for only subkeys (entire subkey tree)
# -Inherit -All             Sets Inheritance for supplied key and subkeys (entire tree)

# -Permissions -Inherit -Subkeys    Sets Permissions for supplied key and Inheritance for subkeys (entire subkey tree)
# -Permissions -Inherit -All        Sets Permissions for supplied key and Inheritance for entire tree

Это будут единственные допустимые комбинации, примером недопустимой комбинации может быть -Permissions -Subkeys -Recurse или -Permissions -Subkeys -All.

[РЕДАКТИРОВАТЬ]

Прочитав это, я думаю, что могу изменить «Subkeys» на «InheritSubkeys» и отказаться от переключателя «All», чтобы прочитать последние 4 строки,

# -InheritSubkeys           Sets Inheritance for only subkeys (entire subkey tree)
# -Inherit -InheritSubkeys  Sets Inheritance for supplied key and subkeys (entire tree)

# -Permissions -InheritSubkeys            Sets Permissions for supplied key and Inheritance for subkeys (entire subkey tree)
# -Permissions -Inherit -InheritSubkeys   Sets Permissions for supplied key and Inheritance for entire tree

person Duzzy    schedule 31.10.2019    source источник
comment
Я чувствую, что Recurse и Inherit должны быть отдельными. Subkeyinherit может работать с обоими.   -  person AdminOfThings    schedule 31.10.2019
comment
Я бы просто Inherit, Recurse и переключился на выбор между Subkey и All. Сделать все по умолчанию. Затем разберитесь с перестановками в сценарии.   -  person Scepticalist    schedule 31.10.2019


Ответы (1)


Я разработал свои имена и с небольшой помощью из ответа здесь Несколько обязательные параметры в одном наборе параметров, наконец-то все заработало так, как я хочу.

Get-Help отображается правильно, завершение табуляции работает правильно, и только допустимые параметры отображаются после ввода дефиса, когда другие присутствуют.

Я до сих пор не совсем понимаю, как это все работает, но это работает, и это все, что меня сейчас волнует.

Итак, мои окончательные имена и наборы параметров:

# -User          (Mandatory)
# -RegKey        (Mandatory)
# -Rights        (Allow | Deny)
# -Permissions   (Validateset)
# -Recurse       (Switch)
# -SubkeysOnly   (Switch)
# -Inherit       (SingleKey | All | Subkeys)

# -Permissions -Rights                    Sets Permissions for supplied key
# -Permissions -Rights -Recurse           Sets Permissions for supplied key and subkeys (entire tree)
# -Permissions -Rights -SubkeysOnly       Sets Permissions for only subkeys (entire subkey tree)

# -Inherit SingleKey                      Sets Inheritance for supplied key
# -Inherit Subkeys                        Sets Inheritance for only subkeys (entire subkey tree)
# -Inherit All                            Sets Inheritance for supplied key and subkeys (entire tree)

# -Permissions -Rights -Inherit Subkeys   Sets Permissions for supplied key and Inheritance for subkeys (entire subkey tree)
# -Permissions -Rights -Inherit All       Sets Permissions for supplied key and Inheritance for entire tree 

function Set-RegistryPermissions
{
    param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$false)]
    [ValidateNotNullOrEmpty()]
    [string]$User,

    [Parameter(Mandatory=$true, ValueFromPipeline=$false)]
    [ValidateNotNullOrEmpty()]
    [string]$RegKey,

    [Parameter(ParameterSetName = 'PermissionsInherit', Mandatory = $true)]
    [Parameter(ParameterSetName = 'SubKeysOnly', Mandatory = $true)]
    [Parameter(ParameterSetName = 'Recurse', Mandatory = $true)]
    [Parameter(ParameterSetName = 'PermissionsRights', Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [Validateset("ChangePermissions","CreateSubKey","Delete","EnumerateSubKeys","ExecuteKey","FullControl", ``
                 "Notify","QueryValues","ReadKey","ReadPermissions","SetValue","TakeOwnership","WriteKey")]
    [string[]]$Permissions,

    [Parameter(ParameterSetName = 'Recurse', Mandatory = $true)]
    [Switch]$Recurse,

    [Parameter(ParameterSetName = 'SubKeysOnly', Mandatory = $true)]
    [Switch]$SubKeysOnly,

    [Parameter(ParameterSetName = 'Inherit', Mandatory = $true)]
    [Parameter(ParameterSetName = 'PermissionsInherit', Mandatory = $true, ValueFromPipeline=$false)]
    [ValidateNotNullOrEmpty()]
    [Validateset("SingleKey","All","Subkeys")]
    [string]$Inherit,

    [Parameter(ParameterSetName = 'SubKeysOnly', Mandatory = $true)]
    [Parameter(ParameterSetName = 'Recurse', Mandatory = $true)]
    [Parameter(ParameterSetName = 'PermissionsInherit', Mandatory = $true)]
    [Parameter(ParameterSetName = 'PermissionsRights', Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [Validateset("Allow","Deny")]
    [string]$Rights
    )
}

Get-Help Set-RegistryPermissions

Если вы хотите скопировать и протестировать, в разрешении ValidateSet должна быть только одна обратная кавычка (`). Мне пришлось добавить секунду, чтобы отобразить его прямо здесь.

Результат Get-Help

SYNTAX
Set-RegistryPermissions -User <string> -RegKey <string> -Permissions {ChangePermissions | CreateSubKey | Delete | EnumerateSubKeys | ExecuteKey | FullControl | Notify | QueryValues | ReadKey | ReadPermissions | SetValue | TakeOwnership | WriteKey} 
-Rights {Allow | Deny}  [<CommonParameters>]

Set-RegistryPermissions -User <string> -RegKey <string> -Permissions {ChangePermissions | CreateSubKey | Delete | EnumerateSubKeys | ExecuteKey | FullControl | Notify | QueryValues | ReadKey | ReadPermissions | SetValue | TakeOwnership | WriteKey} 
-Recurse -Rights {Allow | Deny}  [<CommonParameters>]

Set-RegistryPermissions -User <string> -RegKey <string> -Permissions {ChangePermissions | CreateSubKey | Delete | EnumerateSubKeys | ExecuteKey | FullControl | Notify | QueryValues | ReadKey | ReadPermissions | SetValue | TakeOwnership | WriteKey} 
-SubKeysOnly -Rights {Allow | Deny}  [<CommonParameters>]

Set-RegistryPermissions -User <string> -RegKey <string> -Permissions {ChangePermissions | CreateSubKey | Delete | EnumerateSubKeys | ExecuteKey | FullControl | Notify | QueryValues | ReadKey | ReadPermissions | SetValue | TakeOwnership | WriteKey} 
-Inherit {SingleKey | All | Subkeys} -Rights {Allow | Deny}  [<CommonParameters>]

Set-RegistryPermissions -User <string> -RegKey <string> -Inherit {SingleKey | All | Subkeys}  [<CommonParameters>]

ValidateSet для разрешений может немного затруднить чтение, но это правильно.

person Duzzy    schedule 04.11.2019