Получить объект учетных данных текущего пользователя в Powershell без запроса

У меня есть сценарий Powershell, который будет запущен через инструмент автоматизации против нескольких серверов. Он отлично работает на компьютерах Windows, поскольку удаленные вызовы используют учетную запись службы инструмента без необходимости запрашивать или выставлять какие-либо учетные данные в коде. Этот скрипт также работает против Linux-машин через SSH, используя пакет SharpSSH. SharpSSH автоматически не использует учетные данные пользователя Powershell, но требует либо имя пользователя и пароль, файл ключа RSA, либо объект PSCredential. Я не могу запросить учетные данные, используя Get-Credential, потому что он запускается через инструмент автоматизации. Я не хочу раскрывать имя пользователя и пароль в коде или сидеть там ключ RSA. Я хотел бы построить объект PSCredential от текущего пользователя Powershell (учетная запись службы). Попытка [System.Net.CredentialCache] :: DefaultNetworkCredentials показывает пробел, а [System.Security.Principal.WindowsIdentity] :: GetCurrent () не предоставляет объект или информацию, которые мне нужны.

Кто-нибудь имеет метод создания объекта PSCredential от текущего пользователя? Или, может быть, совершенно другая альтернатива этой проблеме?

Большое спасибо!

API Windows не будет раскрывать необходимую вам информацию, поэтому Powershell не может добраться до них. Его намеренная особенность подсистемы безопасности. Единственный способ для этого – заставить машины Linux доверять вызывающему компьютеру, например, присоединить их к Active Directory (или любой настройке kerberos).

Кроме того, вам нужно будет каким-то образом сохранить и передать эту информацию.

Вы можете сохранить ключ RSA в хранилище ключей пользователя и извлечь его во время выполнения (используя библиотеки .NET Crypto / Keystore), поэтому вы не храните ключ с кодом. Таким образом, сам ключ будет защищен ОС и доступен только тогда, когда вызывающий пользователь был аутентифицирован. У вас будет еще одна вещь для установки, но может быть единственным способом добиться того, к чему вы стремитесь.

Поскольку вы можете получить пароль в открытом тексте из объекта учетных данных, я сомневаюсь, что вы можете получить это без подсказки.

Как насчет шифрования пароля с использованием ключа шифрования учетной записи службы?

Быстрый пример:

Запустите PowerShell в качестве учетной записи службы, запустите следующее и сохраните вывод в текстовый файл (или встройте его в запланированный вызов задачи):

$String = '' ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force) 

Для расшифровки и использования пароля выполните следующие действия в запланированной задаче:

  $EncryptedString = '' [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString))) 

Это должно делать свое дело. Однако вы не можете повторно использовать зашифрованный пароль на другом компьютере, или если по какой-либо причине вы уничтожаете локальный магазин ключей 🙂

Давайте будем гением компьютера.