代码之家  ›  专栏  ›  技术社区  ›  Charles Roper

检测是否在Windows XP下以管理员权限运行

  •  13
  • Charles Roper  · 技术社区  · 17 年前

    我正在努力研究如何检测用户是否在WindowsXP下以管理员权限运行。这在Vista/Win7中很容易做到,这得益于 呼玛 命令。下面是Ruby中有关如何在Vista下执行此操作的一段代码:

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

    http://gist.github.com/65931

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

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

    6 回复  |  直到 11 年前
        1
  •  32
  •   Charles Roper    14 年前

    这将检测用户是否在提升模式下运行(例如“以管理员身份运行”的命令提示)。它取决于您需要管理员权限才能读取本地服务帐户注册表项:

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

    如果无法读取,则返回非零错误代码;如果可以,则返回零错误代码。
    从XP向上工作…

        2
  •  11
  •   aks    17 年前

    如果你跑

    >net localgroup administrators 
    

    在命令shell中,您应该获得WindowsXP中的管理员帐户列表。简单地分析和扫描输出,以检查您想要的特定用户帐户。例如,要检查当前用户是否是管理员,可以执行以下操作-

    >net localgroup administrators | find "%USERNAME%"
    
        3
  •  7
  •   acromm    17 年前

    piskvor选项很好,或者检查这个URL 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;
    
        4
  •  2
  •   Community Mohan Dere    14 年前

    退房 CheckTokenMembership 方法。这里有一个isUserAdmin()实现的示例,另外还有一些关于函数何时不返回预期值以及如何改进它的有用社区反馈。

        5
  •  2
  •   mikeslattery    12 年前

    这将在不进行炮击的情况下发现:

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

    该策略与Peter的策略类似,但开销较小。

        6
  •  1
  •   Community Mohan Dere    9 年前

    以下是更好的(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 当用户属于管理员组时(而不是检查用户是否为管理员)

    (注意:背勾或重音)在PrimeShell中逃离回车,在Ruby中执行shell命令,如C++的系统(“命令”))。

    所以在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...
    
    推荐文章