1

我正在尝试获取C 盘上所有EXE 文件的路径。由于缺乏管理权限,我面临的问题只不过是访问问题。

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

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

如何让 Windows 要求用户将权限提升为管理权限(屏蔽/暗屏消息)?

4

3 回答 3

0

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

这是实现的链接

于 2013-09-14T18:41:30.850 回答
0

我不确定这是否是您问题的答案,但它似乎抑制了权限。要确保您的应用程序以管理员权限运行,请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 返回调用该方法的可执行文件的绝对路径。
例如:如果您的应用程序是记事本,它将返回C:\Windows\System32\Notepad.exe

希望它能解决问题。

于 2013-09-14T18:02:22.033 回答
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);
    }
于 2013-09-14T18:26:19.927 回答