我正在尝试获取 C 盘上存在的所有 EXE 文件的路径。由于缺乏管理权限,我面临的问题只不过是访问问题。
我写了这段代码,但系统拒绝访问这些文件。
DriveInfo drive = new DriveInfo(@"C:\");
foreach (DirectoryInfo dir in drive.RootDirectory.GetDirectories(".*exe",SearchOption.AllDirectories))
{
path.Add(dir.ToString());
}
如何让 Windows 要求用户将权限提升为管理(屏蔽/暗屏消息)?
您需要具有管理权限才能访问根驱动器。可以使用以下代码测试应用是否具有管理员权限。
static void Test()
{
if (!HasAdministratorRights())
{
// throw error to notfying that the app need admin rights
}
// Get files for
}
private static bool HasAdministratorRights()
{
var currentIdentity = WindowsIdentity.GetCurrent();
if (currentIdentity == null)
return false;
return new WindowsPrincipal(currentIdentity)
.IsInRole(WindowsBuiltInRole.Administrator);
}
如果您有任何具有管理员权限的帐户,则可以使用模拟运行该代码片段。
这是实施的链接
我不确定这是否是您问题的答案,但它似乎抑制了权限。若要确保应用程序以管理员权限运行,请从"添加新项"菜单中添加新的manifest
文件。如果一切正常,您应该会在解决方案资源管理器中看到一个名为 app.manifest
的新文件。
完成后,双击从解决方案资源管理器中打开app.manifest
,当它在代码编辑器中打开时,将其trustinfo
部分替换为此部分;
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel node will disable file and registry virtualization.
If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
我们所做的是,我们更改了应用程序的清单,以确保它在运行时获得管理权限。
这是为了说明,如何每次都以管理员身份运行应用程序,但是如果您需要仅检查应用程序是否具有管理权限,则可以通过这种方式进行检查;
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal appprincipal = (WindowsPrincipal) Thread.CurrentPrincipal;
if(appprincipal.IsInRole("Administrators"))//Check if the current user is admin.
{
//Yeah,the app has adminstrative rights,do what you need.
}
else
{
//Not running as administrator,react as needed.
//Show error message.
}
更新
要获取当前应用程序的完整路径,请使用此选项;
string path=Application.ExecutablePath;
Application.ExecutablePath 返回调用该方法的 exceutable 的绝对路径。
例如:如果您的应用程序是记事本,它将返回 C:\Windows\System32\Notepad.exe。
希望它能解决问题。