在 C# 中搜索文件时检查管理员权限



我正在尝试获取 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

希望它能解决问题。

相关内容

  • 没有找到相关文章

最新更新