PowerShell kimlik bilgilerini bir parola istenmeden kullanma


151

Bir etki alanına ait olan bir uzak bilgisayarı yeniden başlatmak istiyorum. Bir yönetici hesabım var ama onu powershell'den nasıl kullanacağımı bilmiyorum.

Bir Restart-Computercmdlet olduğunu ve kimlik bilgilerini aktarabileceğimi biliyorum, ancak etki alanım örneğin mydomain, kullanıcı myuseradım ve mypasswordparolam onu ​​kullanmak için doğru sözdizimi nedir?

Yeniden başlatmayı planlamam gerekiyor, böylece şifreyi yazmam.



Get-credential domain01 \ admin01 ne anlama geliyor? Sonraki komut, yeniden başlatma-bilgisayar -bilgisayaradı $ s -force -throttlelimit 10 -credential $ c'dir. Kimlik bilgilerinin parolayı sormadan alacağı anlamına mı geliyor?
all eyez on me

Yanıtlar:


205

Sorun Get-Credential, her zaman bir şifre sormasıdır. Bununla birlikte, bunun bir yolu vardır, ancak şifrenin dosya sisteminde güvenli bir dizge olarak saklanmasını içerir.

Aşağıdaki makale bunun nasıl çalıştığını açıklamaktadır:

PSCredentials'ı istem olmadan kullanma

Özetle, parolanızı saklamak için bir dosya oluşturursunuz (şifreli bir dize olarak). Aşağıdaki satırda bir parola istenecek ve ardından c:\mysecurestring.txtşifrelenmiş bir dizge olarak saklanacaktır . Bunu sadece bir kez yapmanız gerekir:

read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt

-CredentialPowerShell komutunda bir argüman gördüğünüz her yerde , bu, bir PSCredential. Yani senin durumunda:

$username = "domain01\admin01"
$password = Get-Content 'C:\mysecurestring.txt' | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential `
         -argumentlist $username, $password

$serverNameOrIp = "192.168.1.1"
Restart-Computer -ComputerName $serverNameOrIp `
                 -Authentication default `
                 -Credential $cred
                 <any other parameters relevant to you>

-AuthenticationÇevrenizi bilmediğim için farklı bir anahtar değerine ihtiyacınız olabilir .


24
Sen de yapabilirsin ConvertTo-SecureString "password" -AsPlainText -Force.
x0n

15
Sadece açıklığa kavuşturmak için,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto

-Credential [username] , Read-Host parametrelerinde benim için gerekliydi, aksi takdirde powershell kilitleniyor. -Credential to read-host'u geçtikten sonra, doğrudan powershell konsolunda sorulacak ve parola doğru şekilde saklanacaktır. Teşekkür ederim!
sephirot

Powershell'de Send-MailMessage işlevini kullandığımda bunu nasıl çalıştıracağımı anlamaya çalışıyorum. E-posta kullanıcımın kimlik bilgilerini saklamak ve geçiş yapmak istiyorum, böylece girmeye devam etmek zorunda kalmayacağım. Bunu nasıl yapacağıma dair bir fikrin var mı?
KangarooRIOT

@ user3681591 - Bunu yorumlarda yapmak yerine yeni bir soru sormanızı tavsiye ederim. Teşekkürler.
Kev

71

Başka bir yolu var ama ...

ŞİFRENİZİ YAZI DOSYASINDA İSTEMİYORSANIZ BUNU YAPMAYIN (Şifreleri komut dosyalarında saklamak iyi bir fikir değildir, ancak bazılarımız nasıl olduğunu bilmek ister.)

Tamam, uyarı buydu, işte kod:

$username = "John Doe"
$password = "ABCDEF"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$cred John Doe'dan "ABCDEF" parolasıyla kimlik bilgilerine sahip olacak.

Parolayı kullanıma hazır hale getirmenin alternatif yolları:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force

Teşekkürler. Bu çok yardımcı. Benim durumumda, bir kullanıcı adı ve parola (secureString olarak) alan özel bir powershell cmdlet'i oluşturuyordum. Dahili olarak cmdlet birkaç diğer cmdlet'i çağırır, bazılarının sadece bir kullanıcı ve şifreye ihtiyacı vardır, ancak bunlardan birinin bir kimlik bilgisine ihtiyacı vardır, bu yüzden şifreyi betiğimde sabit kodlamam gerekmez.
BenR

20
Biraz daha basit: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam

Powershell'de Send-MailMessage işlevini kullandığımda bunu nasıl çalıştıracağımı anlamaya çalışıyorum. E-posta kullanıcımın kimlik bilgilerini saklamak ve geçiş yapmak istiyorum, böylece girmeye devam etmek zorunda kalmayacağım. Bunu nasıl yapacağıma dair bir fikrin var mı?
KangarooRIOT

@ user3681591 Bu, Send-MailMessage -Credential $ cred (bu yazıda gösterildiği gibi oluşturulmuş $
krediyle

@JeroenLandheer Cevabınızı denedim (yardım ettiğiniz için teşekkürler!) Ancak işe yaramadı. Benim hatam: - Kimlik bilgisi: '-Kimlik' terimi bir cmdlet, işlev, komut dosyası dosyası veya çalıştırılabilir program adı olarak tanınmıyor.
KangarooRIOT

29

Kimlik bilgilerinin depolanmasıyla ilgili olarak, iki işlev kullanıyorum (normalde profilimden yüklenen bir modülde bulunur):

#=====================================================================
# Get-MyCredential
#=====================================================================
function Get-MyCredential
{
param(
$CredPath,
[switch]$Help
)
$HelpText = @"

    Get-MyCredential
    Usage:
    Get-MyCredential -CredPath `$CredPath

    If a credential is stored in $CredPath, it will be used.
    If no credential is found, Export-Credential will start and offer to
    Store a credential at the location specified.

"@
    if($Help -or (!($CredPath))){write-host $Helptext; Break}
    if (!(Test-Path -Path $CredPath -PathType Leaf)) {
        Export-Credential (Get-Credential) $CredPath
    }
    $cred = Import-Clixml $CredPath
    $cred.Password = $cred.Password | ConvertTo-SecureString
    $Credential = New-Object System.Management.Automation.PsCredential($cred.UserName, $cred.Password)
    Return $Credential
}

Ve bu:

#=====================================================================
# Export-Credential
# Usage: Export-Credential $CredentialObject $FileToSaveTo
#=====================================================================
function Export-Credential($cred, $path) {
      $cred = $cred | Select-Object *
      $cred.password = $cred.Password | ConvertFrom-SecureString
      $cred | Export-Clixml $path
}

Bunu şu şekilde kullanırsın:

$Credentials = Get-MyCredential (join-path ($PsScriptRoot) Syncred.xml)

Kimlik bilgisi dosyası yoksa, ilk kez size sorulacak ve bu noktada kimlik bilgilerini bir XML dosyası içinde şifrelenmiş bir dizede saklayacaktır. Bu satırı ikinci kez çalıştırdığınızda, xml dosyası oradadır ve otomatik olarak açılacaktır.


10

SCOM 2012 işlevlerini farklı bir kimlik bilgisi gerektiren uzak bir sunucudan çalıştırmam gerekiyor. Bir şifre çözme işlevinin çıktısını ConvertTo-SecureString'e girdi olarak geçirerek açık metin şifrelerinden kaçınıyorum. Netlik sağlamak için, bu burada gösterilmemiştir.

Bildirimlerimi kesinlikle yazmayı seviyorum. $ StrPass için tür bildirimi düzgün çalışıyor.

[object] $objCred = $null
[string] $strUser = 'domain\userID'
[System.Security.SecureString] $strPass = '' 

$strPass = ConvertTo-SecureString -String "password" -AsPlainText -Force
$objCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)

4

Yeniden başlatmayı planlıyorsanız, bunu yapmanın iki yolu vardır.

Öncelikle, başka bir makineye bağlanmak ve yeniden başlatmak için gerekli haklara sahip kimlik bilgilerini kullanarak bir makinede bir görev oluşturabilirsiniz. Bu, zamanlayıcıyı kimlik bilgilerini güvenli bir şekilde depolamaktan sorumlu kılar. Yeniden başlatma komutu (Ben bir Powershell adamıyım, ancak bu daha temiz.):

SHUTDOWN /r /f /m \\ComputerName

Yerel makinede zamanlanmış bir görev oluşturmak, bir başkasını uzaktan yeniden başlatmak için komut satırı şöyle olacaktır:

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f /m \\ComputerName" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU "domain\username" /RP "password"

Uzak bir makinede sistem hesabıyla çalışan zamanlanmış bir görev oluşturmak için mevcut kimlik bilgilerinizi kullandığınız ikinci yolu tercih ederim.

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName

Bu aynı zamanda GUI üzerinden de çalışır, kullanıcı adı olarak SYSTEM girin ve şifre alanlarını boş bırakın.


2

Import / Export-CLIXML kullanan bir örnek gördüm.

Çözmeye çalıştığınız sorun için en sevdiğim komutlar bunlar. Ve bunları kullanmanın en basit yolu.

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Please login.'
    Export-CliXML -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

Bu nedenle, dosya yerel olarak mevcut değilse, kimlik bilgilerini isteyecek ve saklayacaktır. Bu, [pscredential]sorunsuz bir nesneyi alacak ve kimlik bilgilerini güvenli bir dize olarak gizleyecektir.

Son olarak, normalde yaptığınız gibi kimlik bilgilerini kullanın.

Restart-Computer -ComputerName ... -Credentail $cred

Güvenlik Üzerine Not :

Kimlik bilgilerini diskte güvenli bir şekilde saklayın

Çözümü okurken, ilk başta diske bir parola kaydetme konusunda dikkatli olabilirsiniz. Sabit sürücünüzü hassas bilgilerle kirletme konusunda dikkatli olmak doğal (ve tedbirli) olsa da, Export-CliXml cmdlet, Windows standart Veri Koruma API'sini kullanarak kimlik bilgisi nesnelerini şifreler. Bu, içeriğinin şifresini yalnızca kullanıcı hesabınızın doğru şekilde çözebilmesini sağlar. Benzer şekilde, ConvertFrom-SecureString cmdlet'i de sağladığınız parolayı şifreler.

Düzenleme: Orijinal soruyu tekrar okuyun. Yukarıdakiler [pscredential], sabit diske başlattığınız sürece çalışacaktır . Yani, onu betiğinize bırakırsanız ve betiği bir kez çalıştırırsanız, o dosyayı oluşturacak ve ardından betiği gözetimsiz çalıştırmak basit olacaktır.


1
Güzel. "Export-CliXML" yazım hatasını düzeltebilir misiniz, "xml" eksik.
Stefan Wilms

1
read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
$pass = cat C:\securestring.txt | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "test",$pass
$mycred.GetNetworkCredential().Password

Parolaları bu şekilde saklarken çok dikkatli olun ... o kadar güvenli değil ...


1

Çözüm

$userName = 'test-domain\test-login'
$password = 'test-password'

$pwdSecureString = ConvertTo-SecureString -Force -AsPlainText $password
$credential = New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $userName, $pwdSecureString

Derleme Makineleri İçin
Önceki kodda, kullanıcı adı ve parola değerlerini derleme makinenizin gizli ("günlüklerden gizlenmiş") ortam değişkenleriyle değiştirin.

Tarafından yapılan test sonuçları

'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password

ve göreceksin

# Results
test-domain
test-login
test-password

-3

neden çok basit bir şey denemiyorsun?

psexec'i 'shutdown / r / f / t 0' komutu ve CMD'den bir PC listesi ile kullanın.


Bu özel bir durum. Mesele, herhangi bir rastgele senaryoda bir giriş penceresi oluşturmuyor.
13'te Overmind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.