Hitelesítő adatokkal kapcsolatos támogatás hozzáadása a PowerShell-függvényekhez
Feljegyzés
A cikk eredeti verziója @joshduffney által írt blogon jelent meg. Ez a cikk a webhelyre való felvételhez lett szerkesztve. A PowerShell csapata köszönjük Joshnak, hogy megosztotta velünk ezt a tartalmat. Kérjük, nézze meg a blogját a duffney.io.
Ez a cikk bemutatja, hogyan adhat hozzá hitelesítő paramétereket a PowerShell-függvényekhez, és hogy miért érdemes. A hitelesítőadat-paraméter lehetővé teszi a függvény vagy parancsmag más felhasználóként való futtatását. A leggyakoribb használat a függvény vagy parancsmag emelt szintű felhasználói fiókként való futtatása.
A parancsmag New-ADUser
például rendelkezik hitelesítő paraméterrel, amelyet tartományadminisztrátori hitelesítő adatokkal adhat meg egy tartományfiók létrehozásához. Feltéve, hogy a PowerShell-munkamenetet futtató normál fiókja még nem rendelkezik ilyen hozzáféréssel.
Hitelesítőadat-objektum létrehozása
A PSCredential objektum olyan biztonsági hitelesítő adatok készletét jelöli, mint a felhasználónév és a jelszó. Az objektum paraméterként továbbítható egy olyan függvénynek, amely a hitelesítőadat-objektum felhasználói fiókjaként fut. A hitelesítő adatokat többféleképpen is létrehozhatja. Hitelesítő objektum létrehozásának első módja a PowerShell-parancsmag Get-Credential
használata. Ha paraméterek nélkül fut, a rendszer felhasználónevet és jelszót kér. Vagy meghívhatja a parancsmagot néhány választható paraméterrel.
Ha előre meg szeretné adni a tartománynevet és a felhasználónevet, használhatja a Hitelesítő adatok vagy a UserName paramétereket. A UserName paraméter használatakor meg kell adnia egy üzenetértéket is. Az alábbi kód bemutatja a parancsmag használatát. A hitelesítő objektumot egy változóban is tárolhatja, így többször is használhatja a hitelesítő adatokat. Az alábbi példában a hitelesítő objektum a változóban $Cred
lesz tárolva.
$Cred = Get-Credential
$Cred = Get-Credential -Credential domain\user
$Cred = Get-Credential -UserName domain\user -Message 'Enter Password'
Néha nem használhatja az előző példában bemutatott hitelesítő objektumok létrehozásának interaktív módszerét. A legtöbb automatizálási eszköz nem interaktív módszert igényel. Ha felhasználói beavatkozás nélkül szeretne hitelesítő adatokat létrehozni, hozzon létre egy jelszót tartalmazó biztonságos sztringet. Ezután adja át a biztonságos sztringet és a felhasználónevet a System.Management.Automation.PSCredential()
metódusnak.
A következő paranccsal hozzon létre egy jelszót tartalmazó biztonságos sztringet:
ConvertTo-SecureString "MyPlainTextPassword" -AsPlainText -Force
Az AsPlainText és a Force paraméterek egyaránt szükségesek. Ezen paraméterek nélkül egy üzenet figyelmezteti, hogy nem szabad egyszerű szöveget átadni egy biztonságos sztringbe. A PowerShell azért adja vissza ezt a figyelmeztetést, mert az egyszerű szöveges jelszó különböző naplókban lesz rögzítve. Miután létrehozott egy biztonságos sztringet, át kell adnia azt a PSCredential()
hitelesítőadat-objektum létrehozásához szükséges metódusnak. Az alábbi példában a változó $password
a hitelesítőadat-objektumot tartalmazó biztonságos sztringet $Cred
tartalmazza.
$password = ConvertTo-SecureString "MyPlainTextPassword" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ("username", $password)
Most, hogy már tudja, hogyan hozhat létre hitelesítő objektumokat, hitelesítő paramétereket adhat hozzá a PowerShell-függvényekhez.
Hitelesítőadat-paraméter hozzáadása
A többi paraméterhez hasonlóan a függvény blokkjához param
is hozzá kell adnia.
Javasoljuk, hogy nevezze el a paramétert $Credential
, mert a meglévő PowerShell-parancsmagok ezt használják. A paraméter típusának a következőnek kell lennie [System.Management.Automation.PSCredential]
: .
Az alábbi példa egy úgynevezett Get-Something
függvény paraméterblokkját mutatja be. Két paramétere van: $Name
és $Credential
.
function Get-Something {
param(
$Name,
[System.Management.Automation.PSCredential]$Credential
)
Az ebben a példában szereplő kód elegendő egy működő hitelesítőadat-paraméter használatához, azonban van néhány dolog, amelyet hozzáadhat, hogy robusztusabb legyen.
Adja hozzá az
[ValidateNotNull()]
érvényesítési attribútumot annak ellenőrzéséhez, hogy az érték átadva van-e a Hitelesítő adatoknak. Ha a paraméter értéke null, ez az attribútum megakadályozza, hogy a függvény érvénytelen hitelesítő adatokkal hajtsa végre.Hozzáadás
[System.Management.Automation.Credential()]
. Ez lehetővé teszi, hogy sztringként adja meg a felhasználónevet, és interaktív kéréssel rendelkezzen a jelszóra.Állítsa be a paraméter alapértelmezett értékét a
$Credential
következőre[System.Management.Automation.PSCredential]::Empty
: . Előfordulhat, hogy a függvény átadja ezt az$Credential
objektumot a meglévő PowerShell-parancsmagoknak. Ha null értéket ad a függvényben hívott parancsmagnak, az hibát okoz. Ha üres hitelesítőadat-objektumot ad meg, azzal elkerülheti ezt a hibát.
Tipp.
Egyes hitelesítő adatokat elfogadó parancsmagok nem támogatják [System.Management.Automation.PSCredential]::Empty
a kívánt módon. Kerülő megoldásért tekintse meg az Örökölt parancsmagok kezelése szakaszt.
Hitelesítő adatok paramétereinek használata
Az alábbi példa a hitelesítő adatok paramétereinek használatát mutatja be. Ez a példa egy , a Pester Könyvből kifelé lévő függvényt Set-RemoteRegistryValue
mutat be. Ez a függvény az előző szakaszban leírt technikák használatával határozza meg a hitelesítőadat-paramétert. A függvény a $Credential
függvény által létrehozott változó használatával hívja Invoke-Command
meg a hívásokat. Így módosíthatja a futó Invoke-Command
felhasználót. Mivel az alapértelmezett érték $Credential
egy üres hitelesítő adat, a függvény hitelesítő adatok megadása nélkül is futtatható.
function Set-RemoteRegistryValue {
param(
$ComputerName,
$Path,
$Name,
$Value,
[ValidateNotNull()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential = [System.Management.Automation.PSCredential]::Empty
)
$null = Invoke-Command -ComputerName $ComputerName -ScriptBlock {
Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
} -Credential $Credential
}
Az alábbi szakaszok különböző módszereket mutatnak be a hitelesítő adatok megadására Set-RemoteRegistryValue
.
Hitelesítő adatok kérése
A zárójelekben ()
való használat Get-Credential
futáskor az első futtatást eredményeziGet-credential
. A rendszer felhasználónevet és jelszót kér. A felhasználónév és a tartomány előzetes feltöltéséhez használhatja a Hitelesítő adatok vagy a UserNameGet-credential
paramétereket. Az alábbi példa egy splatting nevű technikával adja át a paramétereket a Set-RemoteRegistryValue
függvénynek. A splattingről további információt a about_Splatting cikkben talál.
$remoteKeyParams = @{
ComputerName = $env:COMPUTERNAME
Path = 'HKLM:\SOFTWARE\Microsoft\WebManagement\Server'
Name = 'EnableRemoteManagement'
Value = '1'
}
Set-RemoteRegistryValue @remoteKeyParams -Credential (Get-Credential)
Használata (Get-Credential)
nehézkesnek tűnik. Általában, ha a Hitelesítő paramétert csak felhasználónévvel használja, a parancsmag automatikusan kéri a jelszót. Az [System.Management.Automation.Credential()]
attribútum engedélyezi ezt a viselkedést.
$remoteKeyParams = @{
ComputerName = $env:COMPUTERNAME
Path = 'HKLM:\SOFTWARE\Microsoft\WebManagement\Server'
Name = 'EnableRemoteManagement'
Value = '1'
}
Set-RemoteRegistryValue @remoteKeyParams -Credential duffney
Feljegyzés
A megjelenő beállításjegyzék-érték beállításához ezek a példák feltételezik, hogy telepítve vannak a Windows webkiszolgálói funkciói. Futtassa Install-WindowsFeature Web-Server
, és Install-WindowsFeature web-mgmt-tools
ha szükséges.
Hitelesítő adatok megadása változóban
A hitelesítő változót előre is feltöltheti, és átadhatja a függvény hitelesítő paraméterénekSet-RemoteRegistryValue
. Ezt a módszert a folyamatos integrációs/ folyamatos üzembe helyezési (CI/CD) eszközökkel, például a Jenkins, a TeamCity és az Octopus Deploy használatával használhatja. Ha például Jenkinst használ, tekintse meg Hodge blogbejegyzését , amely a Jenkins és a PowerShell automatizálása Windows rendszeren – 2. rész.
Ez a példa a .NET metódussal hozza létre a hitelesítő objektumot, és egy biztonságos sztringet a jelszó átadásához.
$password = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ("duffney", $password)
$remoteKeyParams = @{
ComputerName = $env:COMPUTERNAME
Path = 'HKLM:\SOFTWARE\Microsoft\WebManagement\Server'
Name = 'EnableRemoteManagement'
Value = '1'
}
Set-RemoteRegistryValue @remoteKeyParams -Credential $Cred
Ebben a példában a biztonságos sztring tiszta szöveges jelszóval jön létre. Az összes korábban említett CI/CD rendelkezik egy biztonságos módszerrel a jelszó futásidőben történő megadására. Ezen eszközök használatakor cserélje le az egyszerű szöveges jelszót a használt CI/CD-eszközben definiált változóra.
Futtatás hitelesítő adatok nélkül
Mivel $Credential
az alapértelmezett érték egy üres hitelesítőadat-objektum, hitelesítő adatok nélkül is futtathatja a parancsot, ahogyan az ebben a példában látható:
$remoteKeyParams = @{
ComputerName = $env:COMPUTERNAME
Path = 'HKLM:\SOFTWARE\Microsoft\WebManagement\Server'
Name = 'EnableRemoteManagement'
Value = '1'
}
Set-RemoteRegistryValue @remoteKeyParams
Régi parancsmagok kezelése
Nem minden parancsmag támogatja a hitelesítő objektumokat, vagy nem engedélyezi az üres hitelesítő adatokat. Ehelyett a parancsmag sztringként szeretné megadni a felhasználónevet és a jelszót. Ezt a korlátozást többféleképpen is megkerülheti.
Az if-else használata üres hitelesítő adatok kezeléséhez
Ebben a forgatókönyvben a futtatni kívánt parancsmag nem fogad el üres hitelesítő objektumot. Ez a példa csak akkor adja hozzá a hitelesítőadat-paramétertInvoke-Command
, ha az nem üres. Ellenkező esetben a Invoke-Command
hitelesítő adat paraméter nélkül futtatja .
function Set-RemoteRegistryValue {
param(
$ComputerName,
$Path,
$Name,
$Value,
[ValidateNotNull()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential = [System.Management.Automation.PSCredential]::Empty
)
if($Credential -ne [System.Management.Automation.PSCredential]::Empty) {
Invoke-Command -ComputerName:$ComputerName -Credential:$Credential {
Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
}
} else {
Invoke-Command -ComputerName:$ComputerName {
Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
}
}
}
Üres hitelesítő adatok kezelése splatting használatával
Ez a példa paraméterplatform használatával hívja meg az örökölt parancsmagot. A $Credential
rendszer feltételesen hozzáadja az objektumot a kivonatoló táblához a platformhoz, és nem szükséges megismételni a Invoke-Command
szkriptblokkot. Ha többet szeretne megtudni a függvényeken belüli splattingról, tekintse meg a Splatting Parameters Inside Advanced Functions blogbejegyzést.
function Set-RemoteRegistryValue {
param(
$ComputerName,
$Path,
$Name,
$Value,
[ValidateNotNull()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential = [System.Management.Automation.PSCredential]::Empty
)
$Splat = @{
ComputerName = $ComputerName
}
if ($Credential -ne [System.Management.Automation.PSCredential]::Empty) {
$Splat['Credential'] = $Credential
}
$null = Invoke-Command -ScriptBlock {
Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
} @splat
}
Sztringjelszavak használata
A Invoke-Sqlcmd
parancsmag egy példa egy olyan parancsmagra, amely egy sztringet fogad el jelszóként.
Invoke-Sqlcmd
lehetővé teszi egyszerű SQL-beszúrási, frissítési és törlési utasítások futtatását. Invoke-Sqlcmd
a biztonságosabb hitelesítőadat-objektum helyett egyértelmű szöveges felhasználónévre és jelszóra van szükség. Ez a példa bemutatja, hogyan nyerheti ki a felhasználónevet és a jelszót egy hitelesítő objektumból.
A Get-AllSQLDatabases
példában szereplő függvény meghívja a Invoke-Sqlcmd
parancsmagot egy SQL-kiszolgáló lekérdezésére az összes adatbázisához. A függvény egy hitelesítő paramétert határoz meg ugyanazzal az attribútummal, amelyet az előző példákban használt. Mivel a felhasználónév és a jelszó megtalálható a $Credential
változóban, ezeket az értékeket kinyerheti a használatával Invoke-Sqlcmd
.
A felhasználónév a változó UserName tulajdonságából $Credential
érhető el. A jelszó beszerzéséhez az GetNetworkCredential()
objektum metódusát kell használnia $Credential
. Az értékek olyan változókba lesznek kinyerve, amelyek hozzáadódnak egy kivonattáblához, amelybe a splatting paramétereket használják Invoke-Sqlcmd
.
function Get-AllSQLDatabases {
param(
$SQLServer,
[ValidateNotNull()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential = [System.Management.Automation.PSCredential]::Empty
)
$UserName = $Credential.UserName
$Password = $Credential.GetNetworkCredential().Password
$splat = @{
UserName = $UserName
Password = $Password
ServerInstance = 'SQLServer'
Query = "Select * from Sys.Databases"
}
Invoke-Sqlcmd @splat
}
$credSplat = @{
TypeName = 'System.Management.Automation.PSCredential'
ArgumentList = 'duffney',('P@ssw0rd' | ConvertTo-SecureString -AsPlainText -Force)
}
$Credential = New-Object @credSplat
Get-AllSQLDatabases -SQLServer SQL01 -Credential $Credential
A tanulás hitelesítő adatainak folyamatos kezelése
A hitelesítő adatok biztonságos létrehozása és tárolása nehéz lehet. Az alábbi erőforrások segíthetnek a PowerShell-hitelesítő adatok karbantartásában.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: