【问题标题】:Detect if running with administrator privileges under Windows XP检测是否在 Windows XP 下以管理员权限运行
【发布时间】:2010-10-08 07:17:54
【问题描述】:

我正在尝试研究如何检测用户是否在 Windows XP 下以管理员权限运行。由于 whoami 命令,这在 Vista/Win7 中相当容易做到。这是一个 Ruby 中的 sn-p 说明如何在 Vista 下进行操作:

注意,以下链接现在包含了 muteW 建议的解决方案

http://gist.github.com/65931

问题是,whoami 没有随 Windows XP 一起提供,所以上面链接的方法在 WinXP 上总是会返回 false,即使我们以管理员身份运行。

那么,有没有人知道一种方法来检测我们是否在 Windows XP 下使用 Ruby、命令行工具、批处理文件甚至第三方(确实需要开源)以管理员身份运行工具?

【问题讨论】:

    标签: windows ruby command-line privileges


    【解决方案1】:

    这将检测用户是否在提升模式下运行(例如,“运行为”管理员的命令提示符)。它依赖于您需要管理员权限才能读取 LOCAL SERVICE 帐户注册密钥这一事实:

    reg query "HKU\S-1-5-19"
    

    如果无法读取,这将返回非零错误代码,如果可以读取,则返回零。
    从 XP 开始工作...

    【讨论】:

    • 对于任何使用 C++ 的人,如果上面的命令失败,system() 返回 1,如果成功则返回 0;这意味着如果用户具有管理员权限,则返回 0。很好的答案,彼得。谢谢!
    • 或者,在 C/C++ 中:调用 RegOpenKey(HKEY_USERS, "S-1-5-19", &key) 并检查是否成功。
    【解决方案2】:

    如果你运行

    >net localgroup administrators 
    

    在命令外壳中,您应该获得 Windows XP 中的管理员帐户列表。只需解析和扫描输出以检查您想要的特定用户帐户。例如检查当前用户是否是您可以做的管理员 -

    >net localgroup administrators | find "%USERNAME%"
    

    【讨论】:

    • 这仅验证用户名是否在管理员组中 - 它不会检测当前会话是否具有管理员权限。例如,在带有 UAC 的 Win 7 上,命令提示符默认以非管理员身份运行,上述命令会错误地将会话报告为管理员。请参阅我的解决方案以获得更可靠的解决方案
    【解决方案3】:

    Piskvor 选项很好,或查看此网址 http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/

    这是该页面中的代码

    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup;
    // Initialize SID.
    if( !AllocateAndInitializeSid( &NtAuthority,
                                   2,
                                   SECURITY_BUILTIN_DOMAIN_RID,
                                   DOMAIN_ALIAS_RID_ADMINS,
                                   0, 0, 0, 0, 0, 0,
                                   &AdministratorsGroup))
    {
        // Initializing SID Failed.
        return false;
    }
    // Check whether the token is present in admin group.
    BOOL IsInAdminGroup = FALSE;
    if( !CheckTokenMembership( NULL,
                               AdministratorsGroup,
                               &IsInAdminGroup ))
    {
        // Error occurred.
        IsInAdminGroup = FALSE;
    }
    // Free SID and return.
    FreeSid(AdministratorsGroup);
    return IsInAdminGroup;
    

    【讨论】:

    • 它是使用 WINDOWS API 用 C 语言制作的,所以你不需要任何其他东西来运行它,只需编译它
    • 请注意,如果从以管理员帐户运行的 Vista 程序调用,如果该进程未使用“以管理员身份运行”启动,则此方法将返回 FALSE。
    • 这是一个 Vista 问题。也许您可以在同一个程序中为 Vista OS 添加不同的检查...
    • 供以后参考,以上代码摘自:msdn.microsoft.com/en-us/library/aa376389%28VS.85%29.aspx
    【解决方案4】:

    查看CheckTokenMembership 方法。那里有一个 IsUserAdmin() 实现示例以及一些其他有用的社区反馈,说明该函数何时不返回预期内容以及如何改进它。

    【讨论】:

      【解决方案5】:

      这不用炮轰就知道了:

      require 'win32/registry'
      
      is_admin = false
      begin
        Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
        is_admin = true
      rescue
      end
      

      该策略类似于 Peter 的策略,但开销更少。

      【讨论】:

        【解决方案6】:

        这是更好的 (PowerShell) 方法:https://stackoverflow.com/a/16617861/863980

        在一行中,您可以说(复制/粘贴到 posh 中,它会起作用):

        (@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
        foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
        

        => 当用户属于管理员组时返回True(而不是检查用户是管理员)

        (注意:反引号或重音符 ` 在 PowerShell 中转义回车,在 Ruby 中执行 shell 命令,如 C++ 的 system('command')..)

        所以在 Ruby 中,你可以说(在 irb 中复制/粘贴):

        def is_current_user_local_admin?
          return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
        end
        

        虽然不知道(甚至更好的)WMI 方式。有了它,你可以做类似的事情(再次在 Ruby 中):

        require 'win32ole'
        wmi = WIN32OLE.connect('WinNT://./Administrators,group')
        # don't know what should come here...
        

        【讨论】:

          猜你喜欢
          • 2011-05-12
          • 2012-12-05
          • 1970-01-01
          • 2023-01-20
          • 2010-11-16
          • 1970-01-01
          • 2011-12-20
          相关资源
          最近更新 更多