使用c#检测用户是否是Windows 8的管理员

时间:2012-08-20 18:18:54

标签: c# authorization windows-8

我有一些代码适用于大多数Windows版本,以检测当前用户是否以管理员身份运行。我已经看到了客户使用组策略的问题,但这不起作用。现在我已将工作站升级到Windows 8,代码不再有效。这是代码:

[DllImport("advapi32.dll")]
private static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
private const int Logon32LogonInteractive = 2;
private const int Logon32ProviderDefault = 0;

public void Run() {
    var _token;    
    LogonUser(Username, Domain, Password, Logon32LogonInteractive, Logon32ProviderDefault, ref _token);
     _windowsIdentity = new WindowsIdentity(_token);
     WindowsPrincipal myPrincipal = new WindowsPrincipal(_windowsIdentity);
     var isAdmin = myPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}

在这种情况下,isAdmin应为true时为false。如果有人知道正确的方法来执行此检查将适用于所有版本的Windows,这将是伟大的。如果有人知道如何更改此代码以便它在使用组策略的域中工作,那就更好了。

我试图从我的班级复制适当的代码。显然这不会编译,但如果我遗漏了某些东西,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果在Windows Vista及更高版本上启用了UAC,则代码将无法运行。致quote the documentation

  

注意:在Windows Vista中,用户帐户控制(UAC)确定a的权限   用户。如果您是内置管理员组的成员,则会为您分配两个   运行时访问令牌:标准用户访问令牌和管理员访问令牌。   默认情况下,您处于标准用户角色。当您尝试执行该任务时   需要管理权限,您可以使用动态提升您的角色   同意对话框。执行IsInRole方法的代码不显示   同意对话框。如果您处于标准用户角色,则代码返回false,即使   您在内置管理员组中。您可以在提升之前提升您的权限   通过右键单击应用程序图标并指示您想要执行代码   以管理员身份运行。

除非用户正在提升,否则

isAdmin将为false。您可能会看到此问题:In .NET/C# test if process has administrative privileges了解更多信息。

您可以尝试使用命令式或声明式安全性要求来执行您要执行的特定操作,而不是检查组成员身份。如果您缺少所需的权限,这些将抛出SecurityException,您可以捕获并处理。

答案 1 :(得分:0)

尝试将Logon32LogonInteractive值更改为3 - 即NETWORK_LOGON