Подтвердить что ты не робот

Получить текущий учетный файл пользователя в Powershell без подсказки

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

 $EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>'
 [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString)))

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