पासवर्ड के लिए संकेत किए बिना PowerShell क्रेडेंशियल्स का उपयोग करना


147

मैं एक दूरस्थ कंप्यूटर को पुनः आरंभ करना चाहता हूं जो एक डोमेन से संबंधित है। मेरे पास एक व्यवस्थापक खाता है, लेकिन मुझे यह नहीं पता कि इसे पॉवरशेल से कैसे उपयोग किया जाए।

मुझे पता है कि एक Restart-Computercmdlet है और मैं क्रेडेंशियल पास कर सकता हूं लेकिन अगर मेरा डोमेन उदाहरण के लिए है mydomain, तो मेरा उपयोगकर्ता नाम है myuserऔर मेरा पासवर्ड है mypasswordकि इसका उपयोग करने के लिए सही सिंटैक्स क्या है?

मुझे रिबूट शेड्यूल करने की आवश्यकता है इसलिए मुझे पासवर्ड टाइप करने की आवश्यकता नहीं है।


आप इस पढ़ना चाहिए लिंक
जाम

क्या मिलता है क्रेडेंशियल डोमेन01 \ admin01 का मतलब है? अगला कमांड पुनः आरंभ होता है-कंप्यूटर -कंप्यूटर्नमे $ s -force -throttlelimit 10-credential $ c। क्या इसका मतलब यह है कि इसे प्राप्त किए बिना पासवर्ड को क्रेडेंशियल प्राप्त करें?
सब मुझ पर नजर

जवाबों:


202

इसके साथ समस्या Get-Credentialयह है कि यह हमेशा पासवर्ड के लिए संकेत देगा। हालाँकि इसके चारों ओर एक रास्ता है, लेकिन इसमें पासवर्ड को फाइल सिस्टम पर एक सुरक्षित स्ट्रिंग के रूप में संग्रहीत करना शामिल है।

निम्नलिखित लेख बताता है कि यह कैसे काम करता है:

बिना किसी संकेत के PSCredentials का उपयोग करना

सारांश में, आप अपने पासवर्ड को स्टोर करने के लिए एक फ़ाइल बनाते हैं (एक एन्क्रिप्टेड स्ट्रिंग के रूप में)। निम्न पंक्ति एक पासवर्ड के लिए संकेत करेगी और फिर इसे c:\mysecurestring.txtएन्क्रिप्टेड स्ट्रिंग के रूप में संग्रहीत करेगी । आपको केवल एक बार ऐसा करने की आवश्यकता है:

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

जहां भी आपको -CredentialPowerShell कमांड पर एक तर्क दिखाई देता है तो इसका मतलब है कि आप पास कर सकते हैं PSCredential। तो आपके मामले में:

$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स्विच मान की आवश्यकता हो सकती है क्योंकि मुझे आपके पर्यावरण का पता नहीं है।


23
आप यह भी कर सकते हैं ConvertTo-SecureString "password" -AsPlainText -Force
x0n

14
बस इसे स्पष्ट करने के लिए,$password = ConvertTo-SecureString "password" -AsPlainText -Force
अकीरा यामामोटो

मेरे लिए रीड-होस्ट मापदंडों में क्रैडिटिक [उपयोगकर्ता नाम] की आवश्यकता थी, अन्यथा पावरशेल सिर्फ लटका हुआ है। पास होने के बाद-रीड-होस्ट करने के लिए क्रियेटिव आपको सीधे पॉवरशेल कंसोल में संकेत दिया जाएगा और पासवर्ड सही तरीके से स्टोर किया गया है। धन्यवाद!
सेफीरोट

मैं यह पता लगाने की कोशिश कर रहा हूं कि जब मैं पावरशेल में Send-MailMessage फ़ंक्शन का उपयोग करता हूं तो यह कैसे काम करता है। मैं अपने ईमेल उपयोगकर्ता के क्रेडेंशियल्स को स्टोर करना चाहता हूं और इसे पास करना चाहता हूं इसलिए मुझे इसमें प्रवेश करने की आवश्यकता नहीं है। किसी भी विचार को यह कैसे करना है?
कंगारू

@ user3681591 - मैं टिप्पणियों में ऐसा करने के बजाय एक नया प्रश्न पूछना चाहूंगा। धन्यवाद।
केव

71

एक और तरीका है, लेकिन ...

अगर आप SCRIPT FILE में अपने पास नहीं चाहते तो यह मत कीजिए (यह स्क्रिप्ट में पासवर्ड को स्टोर करने के लिए अच्छा विचार नहीं है, लेकिन हममें से कुछ लोग जानना चाहते हैं कि कैसे।)

ठीक है, यह चेतावनी थी, यहाँ कोड है:

$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 पासवर्ड "ABCDEF" के साथ जॉन डो से साख होगी।

वैकल्पिक उपयोग के लिए पासवर्ड तैयार करने के लिए:

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

धन्यवाद। यह बहुत मददगार है। मेरे मामले में मैं एक कस्टम पॉवरशेल्ड cmdlet बना रहा था जो एक उपयोगकर्ता नाम और पासवर्ड लेता है (जैसा कि SecureString)। आंतरिक रूप से cmdlet कई अन्य cmdlets को कॉल करता है, कुछ को केवल एक उपयोगकर्ता और पासवर्ड की आवश्यकता होती है, लेकिन उनमें से एक को एक क्रेडेंशियल की आवश्यकता होती है इसलिए मुझे वास्तव में अपनी स्क्रिप्ट में पासवर्ड को हार्ड-कोड करने की आवश्यकता नहीं है।
BenR

20
कुछ हद तक सरल: $ पासवर्ड = कन्वर्टो-सेक्रिस्ट्रिंग -स्ट्रिंग "notverysecretpassword" -AsPlainText -Force
सैम

मैं यह पता लगाने की कोशिश कर रहा हूं कि जब मैं पावरशेल में Send-MailMessage फ़ंक्शन का उपयोग करता हूं तो यह कैसे काम करता है। मैं अपने ईमेल उपयोगकर्ता के क्रेडेंशियल्स को स्टोर करना चाहता हूं और इसे पास करना चाहता हूं इसलिए मुझे इसमें प्रवेश करने की आवश्यकता नहीं है। किसी भी विचार को यह कैसे करना है?
कंगारू

@ user3681591 यह Send-MailMessage -Credential $ cred (इस पोस्ट में दिखाए गए अनुसार $ क्रेडिट के साथ बनाया जाएगा)
Jeroen Landheer

@JeroenLandheer मैंने आपके उत्तर की कोशिश की है (मदद के लिए धन्यवाद!) हालांकि यह काम नहीं किया। मेरी त्रुटि है: -Credential: '-Credential' शब्द को किसी cmdlet, फ़ंक्शन, स्क्रिप्ट फ़ाइल या ऑपरेबल प्रोग्राम के नाम के रूप में मान्यता प्राप्त नहीं है।
कंगारू

29

साख संग्रह के बारे में, मैं दो कार्यों का उपयोग करता हूं (जो सामान्य रूप से मेरे प्रोफ़ाइल से लोड किए गए मॉड्यूल में होते हैं)

#=====================================================================
# 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
}

और ये वाला:

#=====================================================================
# 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
}

आप इसे इस तरह उपयोग करते हैं:

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

यदि क्रेडेंशियल फ़ाइल मौजूद नहीं है, तो आपको पहली बार संकेत दिया जाएगा, उस समय यह XML फ़ाइल के अंदर एन्क्रिप्टेड स्ट्रिंग में क्रेडेंशियल्स को संग्रहीत करेगा। दूसरी बार जब आप उस लाइन को चलाते हैं, तो xmlfile वहां होती है और अपने आप खुल जाएगी।


10

मुझे SCOM 2012 फ़ंक्शंस को एक दूरस्थ सर्वर से चलाना होगा जिसमें एक अलग क्रेडेंशियल की आवश्यकता होती है। मैं ConvertTo-SecureString के इनपुट के रूप में एक पासवर्ड डिक्रिप्शन फ़ंक्शन के आउटपुट को पास करके स्पष्ट पाठ पासवर्ड से बचता हूं। स्पष्टता के लिए, यह यहां नहीं दिखाया गया है।

मुझे अपनी घोषणाओं को दृढ़ता से लिखना पसंद है। $ StrPass के लिए प्रकार की घोषणा सही ढंग से काम करती है।

[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

यदि आप रिबूट का समय निर्धारित कर रहे हैं, तो यहां दो तरीके हो सकते हैं।

पहले आप क्रेडेंशियल्स का उपयोग करके एक मशीन पर एक कार्य बना सकते थे, जिसमें किसी अन्य मशीन को जोड़ने और रिबूट करने के लिए आवश्यक अधिकार हैं। यह शेड्यूलर को क्रेडेंशियल्स को सुरक्षित रखने के लिए जिम्मेदार बनाता है। रिबूट कमांड (मैं एक पॉवरशेल लड़का हूं, लेकिन यह क्लीनर है।) है:

SHUTDOWN /r /f /m \\ComputerName

स्थानीय मशीन पर एक निर्धारित कार्य बनाने के लिए कमांड लाइन, दूसरे को रिबूट करने के लिए, निम्न होगी:

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"

मैं दूसरा तरीका पसंद करता हूं, जहां आप अपने वर्तमान क्रेडेंशियल्स का उपयोग एक दूरस्थ मशीन पर सिस्टम खाते के साथ चलने वाले अनुसूचित कार्य को बनाने के लिए करते हैं।

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

यह जीयूआई के माध्यम से भी काम करता है, बस सिस्टम को उपयोगकर्ता नाम के रूप में दर्ज करें, पासवर्ड फ़ील्ड को खाली छोड़ दें।


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

पासवर्ड को इस तरह से रखने के साथ बहुत सावधान रहें ... यह उतना सुरक्षित नहीं है ...


1

मैंने एक उदाहरण देखा कि आयात / निर्यात- CLIXML का उपयोग करता है।

आप जिस मुद्दे को हल करने का प्रयास कर रहे हैं, उसके लिए ये मेरे पसंदीदा आदेश हैं। और उनका उपयोग करने का सबसे सरल तरीका है।

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

इसलिए यदि फ़ाइल स्थानीय रूप से मौजूद नहीं है तो यह क्रेडेंशियल के लिए संकेत देगा और उन्हें संग्रहीत करेगा। यह [pscredential]समस्या के बिना एक वस्तु लेगा और एक सुरक्षित स्ट्रिंग के रूप में क्रेडेंशियल्स छिपा देगा।

अंत में बस क्रेडेंशियल का उपयोग करें जैसे आप सामान्य रूप से करते हैं।

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

प्रतिभूति पर ध्यान दें :

डिस्क पर क्रेडेंशियल्स को सुरक्षित रूप से स्टोर करें

सॉल्यूशन पढ़ते समय, आपको पहले डिस्क पर पासवर्ड स्टोर करने से सावधान रहना चाहिए। हालांकि यह संवेदनशील (और विवेकपूर्ण) है कि आपकी हार्ड ड्राइव को संवेदनशील जानकारी के साथ खदेड़ने से सावधान रहना चाहिए, निर्यात-क्लिक्सल cmdlet विंडोज मानक डेटा प्रोटेक्शन एपीआई का उपयोग करके क्रेडेंशियल ऑब्जेक्ट को एन्क्रिप्ट करता है। यह सुनिश्चित करता है कि केवल आपका उपयोगकर्ता खाता अपनी सामग्री को ठीक से डिक्रिप्ट कर सकता है। इसी प्रकार, ConvertFrom-SecureString cmdlet आपके द्वारा प्रदान किए गए पासवर्ड को भी एन्क्रिप्ट करता है।

संपादित करें: बस मूल प्रश्न को फिर से पढ़ना। उपरोक्त तब तक काम करेगा जब तक आपने [pscredential]हार्ड डिस्क को इनिशियलाइज़ किया है। यदि आप इसे अपनी स्क्रिप्ट में छोड़ देते हैं और स्क्रिप्ट को चला लेते हैं तो यह उस फ़ाइल को बना देगा और फिर स्क्रिप्ट को अनअटेंडेड चलाना सरल होगा।


1

उपाय

$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

बिल्ड मशीनों के
लिए पिछले कोड में उपयोगकर्ता नाम और पासवर्ड मानों को गुप्त ("लॉग से छिपा हुआ") अपनी बिल्ड-मशीन के पर्यावरण चर को बदलें

द्वारा परीक्षा परिणाम

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

और आप देखेंगे

# Results
test-domain
test-login
test-password

-3

क्यों तुम बहुत सरल कुछ की कोशिश नहीं करते?

कमांड 'शटडाउन / आर / एफ / टी 0' और सीएमडी से एक पीसी सूची के साथ psexec का उपयोग करें।


यह एक विशिष्ट मामला है। बिंदु किसी भी यादृच्छिक परिदृश्य में लॉगिन विंडो को नहीं खोल रहा है।
ओवरमाइंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.