Использование удаления элемента с учетными данными
-
28-09-2019 - |
Вопрос
Я пытаюсь использовать командлет удаления элемента в качестве части автоматизации для системы. Файлы хранятся на сервере, который требует повышенных прав для выполнения удаления файла. У меня есть доступ к учетной записи администратора домена, которую я использую для таких сценариев автоматизации.
Подведенный ниже код будет создан PSCredential Object:
$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
Есть идеи?
Решение
Мне не понятно, если файлы локальные (вы запускаете скрипт на сервере) или удаленном (на другой машине). Если локальная попытка запустить команду, используя фоновое задание и пропустите учетные данные, чтобы начать работу:
$job = Start-Job { Remove-Item -LiteralPath $path -force } -cred $cred
Wait-Job $job
Receive-Job $job
Если они удалены, попробуйте использовать удаление:
Invoke-Command -computername servername `
-scriptblock { Remove-Item -LiteralPath $path -force } `
-Cred $cred
ПРИМЕЧАНИЕ. Это требует, чтобы вы выполняли 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
Другие советы
Удаление-элемент может потерпеть неудачу из-за авторизации. В качестве альтернативы либо найдите ссылку для каждого файла и нажмите его с помощью .delete (), либо переместите все файлы в корзину Recycle.
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
}