2010-06-17 11 views
3

Remove-Item cmdlet을 시스템 자동화의 일부로 사용하려고합니다. 파일은 파일 삭제를 수행하는 상승 된 권한이 필요한 서버에 저장됩니다. 자동화 스크립트에 사용하는 도메인 관리자 계정에 대한 액세스 권한이 있습니다.자격 증명이있는 Remove-Item 사용

코드는 아래 PSCredential 개체를 구축 할 것입니다 :

$password = New-Object System.Security.SecureString 
"passwordhere".ToCharArray() | ForEach-Object { $password.AppendChar($_) } 
$cred = New-Object System.Management.Automation.PSCredential("domain\username",$password) 
$cred 
나는 다음과 같은 행동이 개체를 전달하고

:

Remove-Item -LiteralPath $path -Force -Credential $cred 

어떤 아이디어?

답변

6

파일이 로컬 (서버에서 스크립트를 실행 중)인지 원격 (다른 컴퓨터에서)인지는 분명하지 않습니다. 지역은 백그라운드 작업을 사용하여 명령을 실행 시도하고 자격 증명을 전달하는 경우 시작 - 작업하기 :

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

참고 : 그들이 원격 경우

$job = Start-Job { Remove-Item -LiteralPath $path -force } -cred $cred 
Wait-Job $job 
Receive-Job $job 

는 원격를 사용하여 시도를이 당신을해야합니다 원격 컴퓨터에서 Enable-PSRemoting을 실행하십시오.

일반적으로 원시 암호를 스크립트에 넣는 것은 좋은 생각이 아닙니다. 당신은 DPAPI를 사용하여 암호화 된 방식으로 암호를 저장하고 나중에 해당 사용자 계정

# 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가 멋지다! 공유 Thx! – stej

+0

암호를 하드 코드하는 것은 좋지 않지만 호스트에서 테스트해야한다는 데 동의합니다. 그런 자동화에 사용되는 서버를 열어서 도메인 계정으로 로그인했습니다. 여기에서 나는 성공적으로 테스트 할 수있었습니다. Remove-Item은 내가 찾은 최고의 정보를 받아들이지 않습니다. 나는 DPAPI 물건이 의롭기 때문에 당신에게 답을 줄 것입니다. – websch01ar

+1

감사합니다. WRT rename-item 및 -credential은 파일 시스템 제공자에게 있어서는 옳습니다. 이름 바꾸기 항목은 여러 다른 공급자 (레지스트리, 함수 등)에서 작동하기위한 것입니다. 함수를 복사하고 이름을 바꿀 수 있다는 것을 알고 계셨습니까? PowerShell은 이런 식으로 매우 멋지다. 프롬프트 기능을 다른 이름으로 복사하고 새로운 프롬프트 기능으로 실험 한 다음 완료되면 이전 기능을 복원 할 수 있습니다. –

0

제거 품목이 허가로 인해 실패 할 수 있습니다 암호 예컨대을 : 해독 할 수 있습니다. 또는 각 파일에 대한 참조를 찾고 .Delete()를 사용하여 파일을 찾거나 모든 파일을 휴지통으로 이동하십시오.

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 
} 
관련 문제