Winapi GetTokenInformation、TOKEN#U所有者和#x438;查找帐户SIDA

Winapi GetTokenInformation、TOKEN#U所有者和#x438;查找帐户SIDA,winapi,Winapi,我正在尝试使用这些功能来获取运行进程的用户名。代码如下: #include <windows.h> #include <psapi.h> using namespace std; int main() { HANDLE hProcess = GetCurrentProcess(); HANDLE hToken; OpenProcessToken(hProcess, TOKEN_QUERY, &hToken); DWORD

我正在尝试使用这些功能来获取运行进程的用户名。代码如下:

#include <windows.h>
#include <psapi.h>

using namespace std;

int main()    
{
    HANDLE hProcess = GetCurrentProcess();
    HANDLE hToken;
    OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
    DWORD len = 0;
    GetTokenInformation(hToken, TokenOwner, NULL, 0, &len);
    PTOKEN_OWNER to = (PTOKEN_OWNER)LocalAlloc(LPTR, len);
    GetTokenInformation(hToken, TokenOwner, (LPVOID)&to, len, &len);
    char nameUser[50];
    DWORD nameUserSize = sizeof(nameUser);
    SID_NAME_USE snu;
    cout << "work";
    LookupAccountSidA(NULL, to->Owner, nameUser, &nameUserSize, NULL, NULL, &snu);
    cout << "not work";
    cout << nameUser << endl;
    LocalFree(to);
    CloseHandle(hToken);
    CloseHandle(hProcess);
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
HANDLE hProcess=GetCurrentProcess();
拉赫托肯;
OpenProcessToken(hProcess、TOKEN\u QUERY和hToken);
德沃德伦=0;
GetTokenInformation(hToken、TokenOwner、NULL、0和len);
PTOKEN_OWNER to=(PTOKEN_OWNER)LocalAlloc(LPTR,len);
GetTokenInformation(hToken,令牌所有者,(LPVOID)和to,len和len);
字符名用户[50];
DWORD nameUserSize=sizeof(名称用户);
SID_NAME_使用snu;
cout Owner、nameUser和nameUserSize、NULL、NULL和snu);

cout对
GetTokenInformation()
的第二次调用在第三个参数中传递了错误的内存地址。您正在将
的内存地址传递给变量本身,因此您正在询问
GetTokenInformation()
写入周围的堆栈空间。您需要传递变量所指向的内存地址(分配的
令牌\u所有者
结构),因此去掉
&
运算符(以及类型转换,这是不必要的):

您也根本没有进行任何错误处理,因此您不知道是否成功分配了内存,或者是否有任何API函数失败

请尝试以下方法:

#include <windows.h>
#include <psapi.h>

using namespace std;

int main()    
{
    DWORD dwError;

    HANDLE hToken;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        dwError = GetLastError();
        cerr << "OpenProcessToken failed, error " << dwError;
        return 0;
    }

    DWORD len = 0;
    if (!GetTokenInformation(hToken, TokenOwner, NULL, 0, &len))
    {
        dwError = GetLastError();
        if (dwError != ERROR_INSUFFICIENT_BUFFER) 
        {
            cerr << "GetTokenInformation failed, error " << dwError;
            CloseHandle(hToken);
            return 0;
        }
    }

    PTOKEN_OWNER to = (PTOKEN_OWNER) LocalAlloc(LPTR, len);
    if (!to)
    {
        dwError = GetLastError();
        cerr << "LocalAlloc failed, error " << dwError;
        CloseHandle(hToken);
        return 0;
    }

    if (!GetTokenInformation(hToken, TokenOwner, to, len, &len))
    {
        dwError = GetLastError();
        cerr << "GetTokenInformation failed, error " << dwError;
        LocalFree(to);
        CloseHandle(hToken);
        return 0;
    }

    char nameUser[256] = {0};
    char domainName[256] = {0};
    DWORD nameUserLen = 256;
    DWORD domainNameLen = 256;
    SID_NAME_USE snu;

    if (!LookupAccountSidA(NULL, to->Owner, nameUser, &nameUserLen, domainName, &domainNameLen, &snu))
    {
        dwError = GetLastError();
        cerr << "LookupAccountSid failed, error " << dwError;
        LocalFree(to);
        CloseHandle(hToken);
        return 0;
    }

    cout << domainName << '/' << nameUser << endl;

    LocalFree(to);
    CloseHandle(hToken);

    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
德沃德误差;
拉赫托肯;
if(!OpenProcessToken(GetCurrentProcess()、TOKEN\u QUERY和hToken))
{
dwError=GetLastError();

cerr请注意,您可能想要
TokenUser
而不是
TokenOwner
。如果您运行的是Highed,我认为
TokenOwner
通常是Administrators组。好的。您是对的。但是为什么?我不理解不同之处。
TokenOwner
不是令牌的所有者。它是令牌的一部分t确定由在令牌的安全上下文中运行的进程或线程创建的对象的默认所有者。
TokenUser
是令牌所代表的用户。确定。您关于“摆脱&operator”的说法是正确的。但其代码也不起作用。@van9petryk以何种方式?输出是什么?LookupAccountSidA(NULL,to->Owner,nameUser,&nameUserLen,NULL,NULL,&snu)参数#6.它是必需的参数可能,在函数LookupAccountSid中我们有NULL指针取消引用,这导致了crashYes。现在它可以工作了。谢谢。但是你能解释一下,这一行发生了什么:“PTOKEN_Owner to=(PTOKEN_Owner)LocalAlloc(LPTR,len);”我理解了,我们分配内存和指针,返回的指针,我们投给了PtokKyOnger-Objor指针。我从来没有见过这样的方式来用C++ new new操作符分配内存。但是内存如何分配到PSID,这是ToKNKOND所有者结构中的SID指针?
#include <windows.h>
#include <psapi.h>

using namespace std;

int main()    
{
    DWORD dwError;

    HANDLE hToken;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        dwError = GetLastError();
        cerr << "OpenProcessToken failed, error " << dwError;
        return 0;
    }

    DWORD len = 0;
    if (!GetTokenInformation(hToken, TokenOwner, NULL, 0, &len))
    {
        dwError = GetLastError();
        if (dwError != ERROR_INSUFFICIENT_BUFFER) 
        {
            cerr << "GetTokenInformation failed, error " << dwError;
            CloseHandle(hToken);
            return 0;
        }
    }

    PTOKEN_OWNER to = (PTOKEN_OWNER) LocalAlloc(LPTR, len);
    if (!to)
    {
        dwError = GetLastError();
        cerr << "LocalAlloc failed, error " << dwError;
        CloseHandle(hToken);
        return 0;
    }

    if (!GetTokenInformation(hToken, TokenOwner, to, len, &len))
    {
        dwError = GetLastError();
        cerr << "GetTokenInformation failed, error " << dwError;
        LocalFree(to);
        CloseHandle(hToken);
        return 0;
    }

    char nameUser[256] = {0};
    char domainName[256] = {0};
    DWORD nameUserLen = 256;
    DWORD domainNameLen = 256;
    SID_NAME_USE snu;

    if (!LookupAccountSidA(NULL, to->Owner, nameUser, &nameUserLen, domainName, &domainNameLen, &snu))
    {
        dwError = GetLastError();
        cerr << "LookupAccountSid failed, error " << dwError;
        LocalFree(to);
        CloseHandle(hToken);
        return 0;
    }

    cout << domainName << '/' << nameUser << endl;

    LocalFree(to);
    CloseHandle(hToken);

    return 0;
}