Расширение класса PSCredential

#powershell #powershell-4.0

#powershell #powershell-4.0

Вопрос:

Я хотел бы расширить PsCredential класс (в модуле PowerShell v4), чтобы включить имя сервера, а затем иметь возможность сериализовать / десериализовать класс с помощью скрипта, подобного Export-PSCredential. Можно ли это (расширение класса) легко выполнить в модуле PowerShell?

Ответ №1:

Да, это возможно! Вы можете определить свое расширение в XML, в .ps1xml файле, а затем обновить его Update-TypeData , или, что еще лучше, вы можете указать это прямо в манифесте вашего модуля, чтобы это выполнялось при импорте модуля.

Возможно, лучший пример этого — из блога Кита Хилла, где он добавляет свойство BigEndianAddress, чтобы [System.Net.IPAddress] их можно было легко сортировать.

 <?xml version="1.0" encoding="utf-8" ?> 
<Types> 
  <Type> 
    <Name>System.Management.Automation.PSCredential</Name> 
    <Members> 
      <NoteProperty> 
        <Name>ServerName</Name> 
        <Value></Value>
      </NoteProperty> 
    </Members> 
  </Type> 
</Types>
  

(обратите внимание, я не тестировал выше)

При создании New-ModuleManfifest вы можете указать -TypesToProcess параметр с именем файла.

Комментарии:

1. @craig Мне пришлось искать этот термин, но да, это похоже на то, что вы могли бы сделать в Ruby. Этот метод изменяет каждый экземпляр класса, тогда как using Add-Member можно использовать для добавления свойств и методов к одному экземпляру во время выполнения. Это довольно приятно!

2. Будет ли это новое свойство включено в диалоговое окно, созданное с помощью Get-Credential ? Если нет, как бы вы предложили его заполнить?

3. @craig нет, это не будет включено в диалоговое окно. Его заполнение должно быть таким же простым, как присвоение ему: $cred.ServerName = $myServerValue но то, как вы запрашиваете это значение, зависит от вас и зависит от вашей ситуации. В функции я бы использовал параметр. Если бы мне нужен был интерактивный ввод текста в произвольной форме, Read-Host , если бы я хотел интерактивный выбор во время выполнения из списка, я бы использовал Out-GridView -OutputMode Single .

4. Может показаться, что Value свойство должно быть назначено при определении типа (т. Е. В файле ps1xml). $cred.ServerName='foobar' генерирует ошибку, указывающую, что свойство доступно только для чтения. Мне нужно будет подробнее прочитать об этой функции.

5. @craig ах, я этого боялся. Обычно я использую его для свойств скрипта. Вы могли бы сделать это и определить метод получения и установки. Проблема в том, что я не знаю, что вы бы использовали для постоянного хранения в установщике. У меня не было возможности по-настоящему проверить это. Пример из блога Кита Хилла является свойством скрипта, но использует только средство получения, поскольку оно вычисляет его значение из другого свойства.