पथ तक पहुँच अस्वीकृत है (PowerShell नाम-आइटम स्क्रिप्ट)


2

मैं हर समय विंडोज की मदद करने वाली F1 कुंजी से परेशान हो गया क्योंकि मुझे लगता है कि यह बहुत बेकार है। तो समाधान "C: \ Windows" निर्देशिका में "HelpPane.exe" फ़ाइल का नाम कुछ और करने के लिए है ताकि F1 को दबाने से कभी भी कुछ न हो। हालाँकि, मैं इसे एक स्क्रिप्ट के साथ स्वचालित करना चाहूंगा।

PowerShell का उपयोग करते हुए, मैं निम्नलिखित स्क्रिप्ट आज़मा सकता हूं:

Rename-Item -Force -Path "C:\Windows\HelpPane.exe" -NewName "C:\Windows\HelpPane1.exe"

हालाँकि, जब भी मैं स्क्रिप्ट चलाता हूँ, चाहे प्रशासक के रूप में, मुझे निम्न त्रुटि प्राप्त होती है: यहां छवि विवरण दर्ज करें

ऐसा इसलिए है क्योंकि विंडोज की फाइल पर कुछ सुरक्षा अनुमति है। मुझे पता है कि मैं उन्हें गुण / सुरक्षा / उन्नत में गड़बड़ करके मैन्युअल रूप से हटा सकता हूं, लेकिन मुझे PowerShell स्क्रिप्ट में ऐसा करने के लिए एक स्वचालित तरीके की आवश्यकता है; मैं हर बार मैन्युअल रूप से ऐसा नहीं करना चाहता। दुर्भाग्य से, मुझे यकीन नहीं है कि PowerShell के भीतर सीधे इस प्रकार की उन्नत अनुमति कैसे प्रबंधित की जाए।

मुझे यह सुनिश्चित करने के लिए अपनी पॉवरशेल स्क्रिप्ट में क्या जोड़ने की आवश्यकता है कि यह सुनिश्चित हो सके कि फ़ाइल का नाम बदला गया है? धन्यवाद।

संदर्भ के लिए, मैं विंडोज 10 एंटरप्राइज 1607 बिल्ड 14393 चला रहा हूं।


क्या अनुमतियाँ वास्तव में आपको फ़ाइल का नाम बदलने से रोक रही हैं? इस महत्वपूर्ण जानकारी को शामिल करने के लिए अपने प्रश्न को संपादित करें।
रामहुंड

जवाबों:


2

आपको एक एक्सेस कंट्रोल प्रविष्टि जोड़ने की आवश्यकता है जो आपको पर्याप्त नियंत्रण प्रदान करती है, लेकिन ऐसा करने के लिए आपको पहले फ़ाइल का स्वामी होना चाहिए। व्यवस्थापक खुद को किसी भी फ़ाइल का स्वामी बना सकते हैं, लेकिन समायोजन करने वाली प्रक्रिया को SeTakeOwnershipPrivilege विशेषाधिकार सक्षम होना चाहिए। यह सक्षम करना कि अप्रबंधित कोड के साथ फ़िडलिंग की आवश्यकता है, जो ली होम्स ने हमारे लिए किया है । मैंने उसकी स्क्रिप्ट में सुधार किया है और उसकी स्क्रिप्ट को थोड़ा बदल दिया है, जिसे आपको एक फ़ाइल (जैसे privs.ps1) में सहेजना होगा :

param(    ## The privilege to adjust. This set is taken from
    ## http://msdn.microsoft.com/en-us/library/bb530716(VS.85).aspx
    [ValidateSet(
        "SeAssignPrimaryTokenPrivilege", "SeAuditPrivilege", "SeBackupPrivilege",
        "SeChangeNotifyPrivilege", "SeCreateGlobalPrivilege", "SeCreatePagefilePrivilege",
        "SeCreatePermanentPrivilege", "SeCreateSymbolicLinkPrivilege", "SeCreateTokenPrivilege",
        "SeDebugPrivilege", "SeEnableDelegationPrivilege", "SeImpersonatePrivilege", "SeIncreaseBasePriorityPrivilege",
        "SeIncreaseQuotaPrivilege", "SeIncreaseWorkingSetPrivilege", "SeLoadDriverPrivilege",
        "SeLockMemoryPrivilege", "SeMachineAccountPrivilege", "SeManageVolumePrivilege",
        "SeProfileSingleProcessPrivilege", "SeRelabelPrivilege", "SeRemoteShutdownPrivilege",
        "SeRestorePrivilege", "SeSecurityPrivilege", "SeShutdownPrivilege", "SeSyncAgentPrivilege",
        "SeSystemEnvironmentPrivilege", "SeSystemProfilePrivilege", "SeSystemtimePrivilege",
        "SeTakeOwnershipPrivilege", "SeTcbPrivilege", "SeTimeZonePrivilege", "SeTrustedCredManAccessPrivilege",
        "SeUndockPrivilege", "SeUnsolicitedInputPrivilege")]
    $Privilege,
    $ProcessId = $pid,
    [Switch] $Disable
)

$definition = @'
using System;
using System.Runtime.InteropServices;
public class AdjPriv
{

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}

internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

public static bool EnablePrivilege(long processHandle, string privilege, bool disable)
{
bool retVal;
TokPriv1Luid tp;
IntPtr hproc = new IntPtr(processHandle);
IntPtr htok = IntPtr.Zero;
retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
tp.Count = 1;
tp.Luid = 0;
if(disable)
{
tp.Attr = SE_PRIVILEGE_DISABLED;
}
else
{
tp.Attr = SE_PRIVILEGE_ENABLED;
}
retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
return retVal;
}
}
'@

$processHandle = (Get-Process -id $ProcessId).Handle
try { Add-Type $definition } catch {}
[AdjPriv]::EnablePrivilege($processHandle, $Privilege, $Disable)

यदि आप पहले से ही नहीं हैं, तो आपको PowerShell टैग विकी के सक्षम अनुभाग में दिए गए निर्देशों का पालन करना होगा । फिर हम सब कुछ एक साथ रख सकते हैं:

.\privs.ps1 -Privilege SeTakeOwnershipPrivilege
$acl = Get-Acl C:\Windows\HelpPane.exe
$acl.SetOwner([System.Security.Principal.NTAccount]::new('Administrators'))
$rule = [System.Security.AccessControl.FileSystemAccessRule]::new('Administrators', 'FullControl', 'None', 'None', 'Allow')
$acl.AddAccessRule($rule)
Set-Acl C:\Windows\HelpPane.exe $acl

वह ACL को समायोजित करता है, जिससे आपको फ़ाइल का नाम बदलने की अनुमति मिलती है:

Rename-Item C:\Windows\HelpPane.exe HelpPane_.exe

यह पूरी तरह से काम किया, बहुत-बहुत धन्यवाद। मुझे आश्चर्य है कि यह मुश्किल था।
jippyjoe4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.