سؤال

أحاول استخدام 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 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top