Stisknutím tlačítka "Enter" přeskočíte na obsah

Plánovaná úloha pro kopírování souborů s uloženými credentials

Už se Vám někdy stalo, že jste potřebovali opakovaně kopírovat soubory ze sítě, třeba pravidelně jednou za týden, ale to úložiště vyžadovalo ověření.

Pokud zdroj i cíl máte ve stejné doméně, tak to není problém. Stačí script, který vám soubory bude kopírovat spustit pod uživatelem s odpovídajícími oprávněními.

Pokud ale kopírujete například z počítače, který není v doméně, nebo je v jiné doméně, je to už trochu horší.

Samozřejmě, že řešitelné to je a to hned několika způsoby:

1)  budete mít v rámci scriptu uživatelské jméno a heslo v plaintextu.

Toto řešení je samozřejmě nejjednodušší, ale taky je to celkem nebezpečné. Někdo se dostane k tomuto scriptu a bude mít vaše jméno a heslo hezky jak na stříbrném podnose. Navíc bude moci spustit stejný skript odkudkoli se stejnými přístupy.

2) Script zabalíte do EXE souboru a budete spouštět přímo. Pak budete mít heslo přímo v EXE ale nebude v úplně čitelné podobě.

Toto řešení je o něco bezpečnější, ale je potřeba najít „konvertor“ který vám skript do EXE souboru převede. Navíc, pokud budete potřebovat ve skriptu něco změnit, nebo jen použít jiné přihlašovací údaje, musíte provést konverzi znovu. Opět stejně jako v minulém případě, pokud tento „skript“ někdo zkopíruje, bude mít přístup ke stejné cestě odkudkoli.

3) uložit si heslo šifrovaně v XML a pak jej opakovaně načítat.

Toto řešení je nejflexibilnější. Kdykoli se Vám změní přihlašovací údaje (platnost hesla apod.) tak pouze upravíte XML soubor novým heslem a do skriptu nemusíte zasahovat. Výhodu nám v tomto dává přímo Powershell. Pokud uložím datový typ „securestring“ do souboru, automaticky jej zašifruje, ale tak, že jej bude moci načíst pouze ten uživatel, který jej uložil.

Nakonec to může fungovat následovně. Budu mít plánovanou úlohu, kterou budu spouštět pod účtem konkrétního uživatele (svým účtem). Do vzdálené složky se ale musím ověřit jiným účtem. Heslo k tomuto účtu si zašifruji a uložím do XML souboru pod svým účtem, takže si jej nebude moci přečíst nikdo jiný než já, resp. skript spuštěný v mém kontextu.

Potřebuji 2 skripty.

První, který budu používat k ukládání hesla do XML

$Path = ".\passwd.xml"

$Credential = Get-Credential

$export = "" | Select-Object Username, EncryptedPassword
   
# Give object a type name which can be identified later
$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’)
       
$export.Username = $Credential.Username
 
# Encrypt SecureString password using Data Protection API
# Only the current user account can decrypt this cipher
$export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString
 
# Export using the Export-Clixml cmdlet
$export | Export-Clixml $Path

A druhý, který mi heslo přečte, přihlásí se ke vzdálené složce a vykopíruje mi potřebné soubory

$PWDPath = ".\passwd.xml"
$NetworkMap = "\\192.168.5.10\Lic"
$SourceFile = "\\192.168.5.10\Lic\Licenses.txt"
$DestinationFile = "C:\Materials\Licenses\Licenses.txt"

$import = Import-Clixml $PWDPath
       
# Test for valid import
if ( !$import.UserName -or !$import.EncryptedPassword ) {
     Throw "Input is not a valid ExportedPSCredential object, exiting."
     exit
}
$Username = $import.Username
    
# Decrypt the password and store as a SecureString object for safekeeping
try {
    $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString
    }
   catch
   {
   }
if ($SecurePass -eq $null) {
    echo "Bad pass"
    exit
}
# Build the new credential object
$Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass
$net = new-object -ComObject Wscript.Network
# Map network share with credentials
$net.MapNetworkDrive("",$NetworkMap,$false,$UserName, ($Credential.GetNetworkCredential().Password))

Copy-Item $SourceFile $DestinationFile -Force

# Unmap network share
$net.RemoveNetworkDrive($NetworkMap,0)

Pak už jen vyexportovat uživatelské jméno a heslo do XML pomocí prvního skriptu a druhý script nastavit v plánovači aby se spouštěl pod Vaším účtem v plánovaný čas 🙂