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

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

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

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

Ответы [ 3 ]

15 голосов
/ 13 октября 2010

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

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

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

4 голосов
/ 07 марта 2014

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

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

Запустите 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)))

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

3 голосов
/ 12 октября 2010

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

...