En utilisant Remove-Item avec vérification des pouvoirs
-
28-09-2019 - |
Question
Je tente d'utiliser l'applet de commande Remove-Item dans le cadre d'une automatisation d'un système. Les fichiers sont stockés sur un serveur qui nécessite des droits élevés pour effectuer la suppression de fichiers. J'ai accès à un compte administrateur de domaine que j'utilise pour ces scripts d'automatisation.
Le code ci-dessous construira l'objet PSCredential:
$password = New-Object System.Security.SecureString
"passwordhere".ToCharArray() | ForEach-Object { $password.AppendChar($_) }
$cred = New-Object System.Management.Automation.PSCredential("domain\username",$password)
$cred
Je passe cet objet à l'action suivante:
Remove-Item -LiteralPath $path -Force -Credential $cred
Toutes les idées?
La solution
Il est pas clair pour moi si les fichiers sont locaux (vous exécutez le script sur le serveur) ou à distance (sur une autre machine). Si essayer local exécutant la commande en utilisant un travail de fond et de passer dans les lettres de créance au Start-Job:
$job = Start-Job { Remove-Item -LiteralPath $path -force } -cred $cred
Wait-Job $job
Receive-Job $job
Si elles sont à distance, essayez d'utiliser l'accès distant:
Invoke-Command -computername servername `
-scriptblock { Remove-Item -LiteralPath $path -force } `
-Cred $cred
Note: Il faut donc que vous exécutez sur la machine distante Activer-PSRemoting.
En général, les mots de passe de mettre premières dans votre script est pas une bonne idée. Vous pouvez stocker le mot de passe de manière chiffrée en utilisant DPAPI et plus tard, seul ce compte utilisateur peut déchiffrer le mot de passe par exemple.
# Stick password into DPAPI storage once - accessible only by current user
Add-Type -assembly System.Security
$passwordBytes = [System.Text.Encoding]::Unicode.GetBytes("Open Sesame")
$entropy = [byte[]](1,2,3,4,5)
$encrytpedData = [System.Security.Cryptography.ProtectedData]::Protect( `
$passwordBytes, $entropy, 'CurrentUser')
$encrytpedData | Set-Content -enc byte .\password.bin
# Retrieve and decrypted password
$encrytpedData = Get-Content -enc byte .\password.bin
$unencrytpedData = [System.Security.Cryptography.ProtectedData]::Unprotect( `
$encrytpedData, $entropy, 'CurrentUser')
$password = [System.Text.Encoding]::Unicode.GetString($unencrytpedData)
$password
Autres conseils
Remove-Item peut échouer à cause d'une autorisation. Vous pouvez également trouver soit la référence pour chaque fichier et appuyez avec un .Delete () ou déplacer tous les fichiers dans la corbeille.
foreach ($svr in $computers)
{
Invoke-Command -ComputerName $svr {
$folderitems = Get-ChildItem $cachefolder -Recurse
# Method 1: .Delete
foreach ($cachefolderitem in $cachefolderitems)
{
if ($cachefolderitem -like "*.ini")
{
$cachefolderitem.Delete()
}
}
# Method 2: Move all matching files to the recycle bin
Move-Item "$cachefolder\*.ini" 'C:\$Recycle.Bin' -Force
}