#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 ах, я этого боялся. Обычно я использую его для свойств скрипта. Вы могли бы сделать это и определить метод получения и установки. Проблема в том, что я не знаю, что вы бы использовали для постоянного хранения в установщике. У меня не было возможности по-настоящему проверить это. Пример из блога Кита Хилла является свойством скрипта, но использует только средство получения, поскольку оно вычисляет его значение из другого свойства.