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

时间:2013-09-14 16:34:49

标签: c# admin privileges driveinfo

我正在尝试获取 C驱动器上所有 EXE文件的路径。我面临的一个问题只不过是由于缺乏管理权而导致的访问问题。

我编写了这段代码,但系统拒绝访问这些文件。

DriveInfo drive = new DriveInfo(@"C:\\");
foreach (DirectoryInfo dir in drive.RootDirectory.GetDirectories(".*exe",SearchOption.AllDirectories))
{
     path.Add(dir.ToString());                                           
}

如何让Windows让用户提升管理权限(屏蔽/黑屏消息)?

3 个答案:

答案 0 :(得分:0)

我不确定这是否是您问题的答案,但它似乎会取消权限。要确保您的应用程序以管理员权限运行,请添加新的manifest文件,添加新项目菜单如果一切正常,您应该在解决方案资源管理器中看到一个名为app.manifest的新文件。

完成后,双击解决方案资源管理器打开app.manifest,在代码编辑器中打开时,用此替换trustinfo部分; < / p>

 <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的绝对路径 对于Ex :如果您的应用程序是记事本,它将返回 C:\ Windows \ System32 \ Notepad.exe

希望它能解决问题。

答案 1 :(得分:0)

您需要具有访问根驱动器的管理权限。您可以使用以下代码来测试您的应用是否具有管理员权限。

    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);
    }

答案 2 :(得分:0)

如果您有任何管理员权限,那么您可以使用模拟运行该代码段。

Here is the link of implementation