【问题标题】:Check if process user is an administrator c++检查进程用户是否是管理员 c++
【发布时间】:2009-06-11 13:44:38
【问题描述】:

我想获取进程的用户名并检查它是否是本地管理员。或者直接查看当前procees用户是否为本地管理员

【问题讨论】:

标签: c++ process


【解决方案1】:

使用 GetUserName() 获取当前用户名,然后使用您刚刚获得的服务器名称(本地为 NULL)和用户名调用 NetUserGetInfo()。传递一个USER_INFO_1 结构,然后访问结构中的usri1_priv。如果值为 USER_PRIV_ADMIN,那么您将知道用户名是管理员。

【讨论】:

    【解决方案2】:

    在管理员用户和非管理员用户的 Windows XP SP3、Windows 7 32 位和 64 位上进行了测试。 从等效 C# 移植的代码并使用 ATL windows 安全包装类。

    #include <atlbase.h>
    #include <atlsecurity.h>
    
    // The function returns true if the user who is running the
    // application is a member of the Administrators group,
    // which does not necessarily mean the process has admin privileges.
    bool IsAdministrator(HRESULT &rHr)
    {
        bool bIsAdmin = false;
    
        try
        {
            // Open the access token of the current process.
            ATL::CAccessToken aToken;
            if (!aToken.GetProcessToken(TOKEN_QUERY))
            {
                throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32,
                    ::GetLastError());
            }
    
    
            // Query for the access token's group information.
            ATL::CTokenGroups groups;
            if (!aToken.GetGroups(&groups))
            {
                throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32,
                    ::GetLastError());
            }
    
            // Iterate through the access token's groups
            // looking for a match against the builtin admins group.
            ATL::CSid::CSidArray groupSids;
            ATL::CAtlArray<DWORD> groupAttribs;
            groups.GetSidsAndAttributes(&groupSids, &groupAttribs);
            for (UINT i = 0; !bIsAdmin && i < groupSids.GetCount(); ++i)
            {
                bIsAdmin = groupSids.GetAt(i) == ATL::Sids::Admins();
            }
            rHr = S_OK;
        }
        catch (HRESULT hr)
        {
            rHr = hr;
        }
    
        return bIsAdmin;
    }
    

    【讨论】:

      【解决方案3】:

      假设您使用的是 Window 操作系统,则有一个 shell 函数:IsUserAnAdmin

      见MSDN article

      这篇文章确实建议使用你自己的函数,使用 CheckTokenMembership。甚至还有一个代码示例可以帮助您。

      【讨论】:

      • 谢谢!但我得到的只是登录用户我正在寻找一种让用户 wjo 运行服务并检查它是否是本地管理员的方法
      • 我不确定你来自哪里。但我愿意提供帮助。关于您最终要达到的目标的更多背景可能会对我有所帮助。这个服务是你写的吗?如果是这样,您可以在安装期间应用安全性以允许/拒绝用户(和/或组)启动或停止服务,如果这是您所追求的?通常 Windows 服务不会以启动它们的用户身份运行。默认情况下,系统帐户用作运行服务的帐户,但可以将其配置为您希望的任何用户。然后服务线程可以根据需要模拟用户。
      • 我知道这是一个旧答案,但要指出的是,这仅适用于 windows Vista,因此对于 windows 7、8 和 10,此功能将不起作用。
      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2022-10-02
      • 2011-04-05
      相关资源
      最近更新 更多