باستخدام الإزالة مع أوراق الاعتماد
-
28-09-2019 - |
سؤال
أحاول استخدام CMDLET لإزالة العنصر كجزء من أتمتة لنظام ما. يتم تخزين الملفات على خادم يتطلب حقوقًا مرتفعة لإجراء حذف الملف. لديّ إمكانية الوصول إلى حساب مسؤول المجال الذي أستخدمه لنصوص الأتمتة هذه.
سوف يقوم الرمز أدناه ببناء الكائن pscrediential:
$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
ملاحظة: يتطلب ذلك تنفيذ تمكين 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 () أو نقل جميع الملفات إلى سلة إعادة التدوير.
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
}