3

我有一些适用于大多数 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 应该为真时,它是假的。如果有人知道进行此检查的正确方法,该方法适用于所有版本的 Windows,那就太好了。如果有人知道如何更改此代码以便它在使用组策略的域中工作,那就更好了。

我试图从我的班级复制适当的代码。显然这不会编译,但如果我错过了什么,请告诉我。

谢谢!

4

2 回答 2

2

如果在 Windows Vista 及更高版本上启用了 UAC,您的代码将不起作用。引用文档:

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

isAdmin除非用户运行提升,否则将为假。您可能会看到这个问题:在 .NET/C# 中测试进程是否具有更多管理权限

您可以尝试对您想要做的特定事情使用命令式或声明式安全要求,而不是检查组成员身份。如果您缺少所需的权限,这些将引发 SecurityException,您可以捕获并处理这些权限。

于 2012-08-20T19:20:41.393 回答
0

尝试将 Logon32LogonInteractive 值更改为 3 - 这是 NETWORK_LOGON

于 2012-08-20T19:55:08.083 回答