2010-06-17 2 views
3

Je tente d'utiliser la cmdlet Remove-Item dans le cadre d'une automatisation pour un système. Les fichiers sont stockés sur un serveur qui nécessite des droits élevés pour effectuer la suppression du fichier. J'ai accès à un compte d'administrateur de domaine que j'utilise pour de tels scripts d'automatisation.Utilisation de Remove-Item avec informations d'identification

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?

Répondre

6

Je ne sais pas si les fichiers sont locaux (vous exécutez le script sur le serveur) ou distants (sur une autre machine). Si essayez 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 Remoting:

Invoke-Command -computername servername ` 
       -scriptblock { Remove-Item -LiteralPath $path -force } ` 
       -Cred $cred 

Note: Cela exige que vous exécutez Enable-PSRemoting sur la machine distante.

En général, mettre des mots de passe bruts dans votre script n'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 
+0

DPAPI est cool! Merci de partager! – stej

+0

Je suis d'accord que le codage en dur d'un mot de passe est une mauvaise idée, mais c'était une exigence pour les tests de mon hôte. J'ai décidé d'ouvrir notre serveur utilisé pour une telle automatisation et je me suis connecté en tant que compte de domaine. De là, j'ai pu tester avec succès. Remove-Item n'est pas en mesure d'accepter les informations d'identification du meilleur que je peux trouver. Je vais vous donner le crédit que la réponse parce que les choses DPAPI est juste. – websch01ar

+1

Merci. WRT rename-item et -credential vous avez raison quand il s'agit du fournisseur de système de fichiers. Gardez à l'esprit que l'élément rename-item est conçu pour fonctionner avec différents fournisseurs (registre, fonction, etc.). Saviez-vous que vous pouvez copier et renommer des fonctions? PowerShell est plutôt cool de cette façon. Vous pouvez copier votre fonction d'invite sous un nom différent, expérimenter avec une nouvelle fonction d'invite, puis restaurer l'ancienne lorsque vous avez terminé. –

0

Remove-Item peut échouer à cause d'une autorisation. Vous pouvez également rechercher la référence pour chaque fichier et la frapper 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 
} 
Questions connexes