none
get-csuser с помощью invoke-command | powershell RRS feed

  • Вопрос

  • День добрый.

    Появилась необходимость удаленно отключать пользователей в lync.

    Invoke-Command -ComputerName lync -ScriptBlock { get-csuser }

    выдает

    Active Directory error "-2147016672" occurred while searching for domain controllers in domain "dom.com": "An operatio
    ns error occurred.

    Про подключение с запросом -credential ознакомлен, как и с CredSSP. Хранить в скрипте, или вбивать каждый раз логин и пароль не хочется. Как быть?

    Спасибо

    28 августа 2014 г. 11:25

Ответы

  • 1) Создать задание в task scheduler на lync сервер, которое будет читать из файла, каких пользователь отключать и уже удаленно запускать это задание.

    2) Использовать файл с паролем в шифрованном виде.

    http://www.sysaddict.me/2013/02/securely-storing-passwords-with.html

    http://powertoe.wordpress.com/2011/06/05/storing-passwords-to-disk-in-powershell-with-machine-based-encryption/

    Или более сложный способ используя сертификаты:

    https://github.com/dlwyatt/ProtectedData

    • Предложено в качестве ответа Vector BCOModerator 28 августа 2014 г. 12:26
    • Помечено в качестве ответа JabBaton 28 августа 2014 г. 12:55
    28 августа 2014 г. 11:53
    Отвечающий
  • ProtectData модуль так и не смог подцепить. То ли руки не оттуда растут, то ли комп тупит.

    Шифровать бы файл сертификатом пользователя. Вот хорошая вещь

    Пути куда можно скопировать модуль взять из переменной $env:PSModulePath

    # Импортируем модуль
    Import-Module ProtectedData
    
    # Список доступных функций в модуле
    Get-Command -Module ProtectedData
    
    CommandType     Name                                               ModuleName
    -----------     ----                                               ----------
    Function        Add-ProtectedDataCredential                        ProtectedData
    Function        Get-KeyEncryptionCertificate                       ProtectedData
    Function        Get-ProtectedDataSupportedTypes                    ProtectedData
    Function        Protect-Data                                       ProtectedData
    Function        Remove-ProtectedDataCredential                     ProtectedData
    Function        Unprotect-Data                                     ProtectedData
    
    # Получим список сертификатов, которые можно использовать для шифрования
    Get-KeyEncryptionCertificate -RequirePrivateKey -SkipCertificateVerification
    
    # Выбираем требуемый по полю Thumbprint
    $cert = Get-KeyEncryptionCertificate -CertificateThumbprint A0C886E556B3C85471B95C54252E70D34E5B0FB9
    
    # Вводим имя пользователя и пароль
    $credential = Get-Credential
    
    # Шифруем и экмпортируем данные
    $credential | Protect-Data -CertificateThumbprint $cert.Thumbprint -SkipCertificateVerification | Export-Clixml key.xml

    Экспортируем сертификат,которым шифровали данные и импортируем на требуемый компьютер:

    # Импортируем модуль
    Import-Module ProtectedData
    
    # Выбираем требуемый по полю Thumbprint
    $cert = Get-KeyEncryptionCertificate -CertificateThumbprint A0C886E556B3C85471B95C54252E70D34E5B0FB9
    
    # Получаем данные из файла key.xml
    $data =Import-Clixml .\key.xml
    
    # Расшифровываем
    $data | Unprotect-Data -CertificateThumbprint $cert.Thumbprint
    Если сертификат помечен, как недоверенный, то используем ключ -SkipCertificateVerification.

    • Изменено KazunEditor 4 сентября 2014 г. 12:14
    • Помечено в качестве ответа JabBaton 4 сентября 2014 г. 12:52
    4 сентября 2014 г. 12:13
    Отвечающий

Все ответы

  • 1) Создать задание в task scheduler на lync сервер, которое будет читать из файла, каких пользователь отключать и уже удаленно запускать это задание.

    2) Использовать файл с паролем в шифрованном виде.

    http://www.sysaddict.me/2013/02/securely-storing-passwords-with.html

    http://powertoe.wordpress.com/2011/06/05/storing-passwords-to-disk-in-powershell-with-machine-based-encryption/

    Или более сложный способ используя сертификаты:

    https://github.com/dlwyatt/ProtectedData

    • Предложено в качестве ответа Vector BCOModerator 28 августа 2014 г. 12:26
    • Помечено в качестве ответа JabBaton 28 августа 2014 г. 12:55
    28 августа 2014 г. 11:53
    Отвечающий
  • Первый способ обдумывал, но реализация не очень как то.

    Во втором хранить пароль в файле, который любой может расшифровать с помощью PoSh, как то не безопасно. Хотя права на файл настроить можно.

    С третьим чтото никак не пойму. Модуль не прикрепляется. Можт советом поделится кто, как его пользовать то.

    И отчего не работает дефолтный enter-pssession? Есть наметки?

    Спасибо!

    2 сентября 2014 г. 10:25
  • 1) Во втором хранить пароль в файле, который любой может расшифровать с помощью PoSh, как то не безопасно. Хотя права на файл настроить можно.

    DPAPI реализован в ConvertFrom-SecureString и ConvertTo-SecureString,для шифрования используется мастер ключ пользователя,поэтому кроме файла, потребуется и ключ пользователя. Поэтому требуется уже минимум права администратора.

    2) И отчего не работает дефолтный enter-pssession?

    enter-pssession -  в скриптах нельзя использовать. Invoke-Command не поддерживает параметр -UseDefaultCredential,поэтому как работает RDP SSO с политикой Allow Delegating Default Credentials - работать не получится. Поэтому явно приходиться указывать учетные данные. Про баг можно прочитать - https://connect.microsoft.com/PowerShell/feedback/details/498377/credssp-should-allow-delegation-of-default-current-credentials

    3) Можно попробовать для сервера Lync указать в AD - Trust this computer for delegation to any service. Для применения потребуется или перезагрузка сервера, или ждать обновление билетов керберов( можно выполнить команду klist purge)


    4) На локальный компьютер, если ОС x64 можно установить Lync Management Shell и производить действия локально,без Invoke-Command. 
    • Изменено KazunEditor 2 сентября 2014 г. 11:41
    2 сентября 2014 г. 11:08
    Отвечающий
  • 1. Не получается расшифровать файл на другом PC под тем же логином.

     Исключение при вызове "Unprotect" с "3" аргументами: "Ключ не может быть использован в указанном состоянии.
    "
    D:\GetPass.ps1:4 знак:5
    +     $plainText = [System.Security.Cryptography.ProtectedData]::Unprotect($cipher ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : CryptographicException
     
    Исключение при вызове "GetString" с "1" аргументами: "Массив не может быть неопределенным.
    Имя параметра: bytes"
    D:\GetPass.ps1:5 знак:5
    +     $password = [System.Text.Encoding]::Unicode.GetString($plainText)
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ArgumentNullException
      
    

    И не совсем понятен момент с минимум правами администратора. Т.е. для расшифровки файла потребуются как минимум права админа в Домене? Или в целом?

    А за 4тый пункт отдельное спасибо.

    3 сентября 2014 г. 10:35
  • Кроме ключа пользователя, есть ключ и для машины. Поэтому для перемещения между различными компьютерами использовать параметр -Key. Т.к. вы не читаете,что я привожу, то приходиться дублировать ссылку - http://powertoe.wordpress.com/2011/06/05/storing-passwords-to-disk-in-powershell-with-machine-based-encryption/

    Имелось ввиду для возможности атаки и кражи ключа.

    3 сентября 2014 г. 11:03
    Отвечающий
  • $key = (255,23,42,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43,6,6,6,6,6,6,31,33,60,26)
    $pass = Read-Host -AsSecureString
    $securepass = $pass |ConvertFrom-SecureString -Key $key
    $bytes = [byte[]][char[]]$securepass            
    
    $csp = New-Object System.Security.Cryptography.CspParameters
    $csp.KeyContainerName = "SecureScript"
    $csp.Flags = $csp.Flags -bor [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore
    $rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider -ArgumentList 5120,$csp
    $rsa.PersistKeyInCsp = $true            
    
    $encrypted = $rsa.Encrypt($bytes,$true)
    $encrypted |Export-Clixml 'D:\word.xml'

    В плане расшифровки пользователя понятно: создается ключ machinekey, который имеет права только создателя. Если нужно кому другому дать расшифровывать, нужно дать доступ.

    При переносе ключа на другой комп и помещении его в "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" под тем же пользователем не удается расшифровать. Может я чтото делаю не так?

    4 сентября 2014 г. 10:03
  • ProtectData модуль так и не смог подцепить. То ли руки не оттуда растут, то ли комп тупит.

    Шифровать бы файл сертификатом пользователя. Вот хорошая вещь

    4 сентября 2014 г. 10:11
  • На компьюетере,где создавался ключ:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -px "SuperSecretProcessOnMachine" D:\key.xml -pri

    Копируем key.xml на другой компьютер:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pi "SuperSecretProcessOnMachine" C:\key.xml

    4 сентября 2014 г. 11:19
    Отвечающий
  • ProtectData модуль так и не смог подцепить. То ли руки не оттуда растут, то ли комп тупит.

    Шифровать бы файл сертификатом пользователя. Вот хорошая вещь

    Пути куда можно скопировать модуль взять из переменной $env:PSModulePath

    # Импортируем модуль
    Import-Module ProtectedData
    
    # Список доступных функций в модуле
    Get-Command -Module ProtectedData
    
    CommandType     Name                                               ModuleName
    -----------     ----                                               ----------
    Function        Add-ProtectedDataCredential                        ProtectedData
    Function        Get-KeyEncryptionCertificate                       ProtectedData
    Function        Get-ProtectedDataSupportedTypes                    ProtectedData
    Function        Protect-Data                                       ProtectedData
    Function        Remove-ProtectedDataCredential                     ProtectedData
    Function        Unprotect-Data                                     ProtectedData
    
    # Получим список сертификатов, которые можно использовать для шифрования
    Get-KeyEncryptionCertificate -RequirePrivateKey -SkipCertificateVerification
    
    # Выбираем требуемый по полю Thumbprint
    $cert = Get-KeyEncryptionCertificate -CertificateThumbprint A0C886E556B3C85471B95C54252E70D34E5B0FB9
    
    # Вводим имя пользователя и пароль
    $credential = Get-Credential
    
    # Шифруем и экмпортируем данные
    $credential | Protect-Data -CertificateThumbprint $cert.Thumbprint -SkipCertificateVerification | Export-Clixml key.xml

    Экспортируем сертификат,которым шифровали данные и импортируем на требуемый компьютер:

    # Импортируем модуль
    Import-Module ProtectedData
    
    # Выбираем требуемый по полю Thumbprint
    $cert = Get-KeyEncryptionCertificate -CertificateThumbprint A0C886E556B3C85471B95C54252E70D34E5B0FB9
    
    # Получаем данные из файла key.xml
    $data =Import-Clixml .\key.xml
    
    # Расшифровываем
    $data | Unprotect-Data -CertificateThumbprint $cert.Thumbprint
    Если сертификат помечен, как недоверенный, то используем ключ -SkipCertificateVerification.

    • Изменено KazunEditor 4 сентября 2014 г. 12:14
    • Помечено в качестве ответа JabBaton 4 сентября 2014 г. 12:52
    4 сентября 2014 г. 12:13
    Отвечающий
  • Еще один вопрос

    $data | Unprotect-Data -CertificateThumbprint $cert.Thumbprint

    это возвращает таблицу

    login secure.string

    как её запихнуть в строку авторизации, или выудить login и pass по отдельности?

    New-SshSession -ComputerName xx.srv.ru -Username $usr -Password $pass

    И можно ли шифровать, скажем сертификатом code signing, или личным сертификатом пользователя?

    25 сентября 2014 г. 18:13
  • $cred = $data | Unprotect-Data -CertificateThumbprint $cert.Thumbprint
    
    PS > $cred.GetNetworkCredential() | Format-Table -Auto UserName,Password
    
    UserName Password
    -------- --------
    sasha    P@$$w0rd1
    
    PS > $cred.GetNetworkCredential().UserName
    sasha
    PS > $cred.GetNetworkCredential().Password
    P@$$w0rd1

    И можно ли шифровать, скажем сертификатом code signing, или личным сертификатом пользователя? - В чем сложность воспользоваться командлетом Get-KeyEncryptionCertificate и посмотреть, можно или нельзя? Личным сертификатом пользователя точно можно.


    26 сентября 2014 г. 4:54
    Отвечающий
  • Cпасибо Kazun. К вечеру мозги совсем не работают. Благодарю
    26 сентября 2014 г. 5:11