安装 Windows 10 后,我似乎失去了以管理员组用户身份运行 explorer.exe 的能力。
我想要这样做的原因是,在我们团队的开发环境中,我们使用 C# exe 进行一些环境配置,它将在管理员模式下启动命令提示符并替换驱动器。因此,由于文件资源管理器不是以管理员身份运行的,因此这些替换的驱动器在文件资源管理器中不可见。这会有点不方便,有时还会出错。
我能够从任务管理器运行 explorer.exe,并选中“使用权限创建”选项,然后我就可以在资源管理器中看到所有驱动器。但现在这不再起作用了。
我知道还有其他选项可以解决这个工作流程,但只是想确保在 Windows 10 下是否完全不可能?
任何评论都值得赞赏。
答案1
我找到了一种跑步的方法不久前以管理员身份访问 Explorer:
启动 regedit.exe 并转到以下键。您应该能够将此字符串复制/粘贴到 regedit 地址栏中:
HKEY_CLASSES_ROOT\AppID\{CDCBCFCA-3CDC-436f-A4E2-0E02075250C2}
右键单击
Permissions
并将您的用户设置为密钥的所有者(单击advanced
按钮即可获取所有权),并授予您当前的用户写入权限。
或使用第三方工具所有权变更完全控制密钥:
- 下一个,删除或者改名价值运行方式。
现在Elevated-Unelevated Explorer Factory
(导致被Run As admin
忽略)已被禁用,您可以使用管理员权限启动 Explorer。
注意:完成此操作后,为了以管理员身份启动 Explorer,请不要执行以下操作:任务管理器 > 运行 > explorer.exe,并勾选“以管理员身份”,它将不起作用。而是在桌面上创建一个资源管理器快捷方式,右键单击它并选择“以管理员身份运行”或编辑快捷方式 > 高级 > 以管理员身份运行。
答案2
对于一些小事,比如浏览一个文件夹(如果不提升浏览器权限就无法浏览),我会先提升权限notepad
,然后在文件打开对话框中浏览所有目录。右键单击,我可以做很多事情。(这是一个快速的解决方案,基本上可以解决问题。)
答案3
以管理员身份启动命令行。
输入以下命令:
taskkill /im explorer.exe
explorer.exe
答案4
要应用@magicandre1981 接受的解决方案复制并粘贴 PowerShell 脚本,只需从升高PowerShell 提示符:
Function Enable-Privilege
{
param([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
$type = Add-Type $definition -PassThru
$type[0]::EnablePrivilege($processHandle, $Privilege, $Disable)
}
$path = 'HKLM:\Software\Classes\AppID\{CDCBCFCA-3CDC-436f-A4E2-0E02075250C2}'
$acl = Get-Acl $path
$originalOwner = $acl.GetOwner([System.Security.Principal.NTAccount]).Value
$acl.SetOwner((New-Object System.Security.Principal.NTAccount([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)))
$acl | Set-Acl $path
Rename-ItemProperty -LiteralPath $path -Name "RunAs" -NewName "__RunAs";
$acl = Get-Acl $path
$acl.SetOwner((New-Object System.Security.Principal.NTAccount($originalOwner)))
Enable-Privilege SeRestorePrivilege
$acl | Set-Acl $path
它将RunAs
值名称重命名为__RunAs
。