服务程序中如何得到当前登陆用户名(ZZ)

转载 2006年06月09日 15:05:00

这也是开发当中经常遇到的一个问题,因为服务程序是用system身份运行的,所以如果直接使用getusername是不行的。但是如果用我上一篇文章中的思路,那么这个问题同样也可以迎刃而解了。方法就是可以通过取得shell的token,根据这个token来得到Sid,在根据Sid来得到当前登陆的用户名和domain。下面是示例代码:

//根据进程名称得到进程token

BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE         hProcessSnap = NULL;
    BOOL           bRet      = FALSE;
    PROCESSENTRY32 pe32      = {0};

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    pe32.dwSize = sizeof(PROCESSENTRY32);

    if (Process32First(hProcessSnap, &pe32))
    {
        do
        {
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
        }
        while (Process32Next(hProcessSnap, &pe32));
        bRet = TRUE;
    }
    else
        bRet = FALSE;

    CloseHandle (hProcessSnap);
    return (bRet);
}

BOOL GetCurrentUserName()
{
HANDLE hToken;

//得到shell的token
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
{
return FALSE;
}
DWORD        cbti     = 0;
PTOKEN_USER  ptiUser  = NULL;
SID_NAME_USE snu;

//取得所需空间大小
if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti))
{
CloseHandle(hToken);
return FALSE;
}

//分配空间
ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti);
if(!ptiUser)
{
CloseHandle(hToken);
return FALSE;
}

//取得token信息
if (!GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
{
CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return FALSE;
}

char szUser[50];
char szDomain[50];
DWORD nUser = 50;
DWORD nDomain = 50;

//根据用户的sid得到用户名和domain

if (!LookupAccountSid(NULL, ptiUser->User.Sid, szUser, &nUser,
szDomain, &nDomain, &snu))
{
CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return FALSE;
}
OutputDebugString(szUser);
OutputDebugString("/r/n");
OutputDebugString(szDomain);
OutputDebugString("/r/n");

CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return TRUE;
}

相关文章推荐

服务程序中如何得到当前登陆用户名

这也是开发当中经常遇到的一个问题,因为服务程序是用system身份运行的,所以如果直接使用getusername是不行的。但是如果用我上一篇文章中的思路,那么这个问题同样也可以迎刃而解了。方法就是可以...

查询操作系统当前服务程序

  • 2010年04月06日 13:22
  • 32KB
  • 下载

自己写注册表,让程序跟windows服务程序一样,在windows登陆之前启动

自己写注册表,让程序跟windows服务程序一样,在windows登陆之前启动。 需要写入注册表的信息: /* Windows Registry Editor Version 5.0...

创建设一个开机自动运行的计划任务,并且命名和当前登陆用户名相关

很多时候,有些程序希望它开机自动运行。当然实现的方式有很多种,如:注册表项、开始-程序-启动文件夹、计划任务、系统服务程序等等。   然而,计划任务是一般用户了解最少的一种。并且前两种是很容易修改和...

网络串口服务程序

  • 2017年08月08日 13:29
  • 49.36MB
  • 下载

C/C++ 创建windows系统服务程序

Windows上面的程序可以分为前台运行和后台运行,像windows的系统服务都是属于后台程序。 那如何将一个程序变成后台运行呢? 可以在 cmd里面用sc命令来操作:Windows 服务的安装和卸载...

mac系统下air服务程序

  • 2013年08月11日 15:17
  • 1.98MB
  • 下载

地陪服务程序迎接工作

  • 2013年09月06日 17:13
  • 204KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务程序中如何得到当前登陆用户名(ZZ)
举报原因:
原因补充:

(最多只允许输入30个字)