服务程序中如何得到当前登陆用户名(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;
}

Window Service程序中如何获取登陆用户的信息

在windows底层的api中,提供了以下的方法来满足需求:     WTSGetActiveConsoleSessionId: 获取当前active User的 session ID。 ...
  • kelsel
  • kelsel
  • 2016年10月08日 17:05
  • 201

Linux获取当前用户信息函数

http://www.cnblogs.com/dirt2/p/5999842.html 转自:http://net.pku.edu.cn/~yhf/linux_c/function/07.h...
  • chenyijun
  • chenyijun
  • 2017年06月01日 15:26
  • 573

如何在Windows服务中以当前用户启动一个程序

总所周知,大多数Windows服务是以SYSTEM用户启动的,
  • numen27
  • numen27
  • 2014年05月06日 13:23
  • 1915

在用户登录的时候,将用户名显示在登录成功的页面,使用session。

在用户登录的时候,将用户名显示在登录成功的页面,使用session。 用户登录jsp form action="user.do?method=login" id="form1" ...
  • u011198630
  • u011198630
  • 2016年02月25日 15:30
  • 11590

Spring MVC(二)基于注解的登陆界面获取用户名和密码并跳转其它页面

基于注解实现在登陆界面填写用户名和密码,提交后获取用户名和密码跳转到另一个页面 项目结构图: 一、新建一个JAVA WEB项目,并导入Spring的相关JAR包,并在web.xml中声明拦截器Di...
  • u014042146
  • u014042146
  • 2015年11月26日 17:59
  • 2762

模拟登陆CSDN——就是这么简单

模拟登陆CSDN——就是这么简单
  • u012345283
  • u012345283
  • 2014年08月24日 01:43
  • 4259

android--登录例子,保存用户名和密码到这个应用所在文件中,从文件中读取用户名和密码

登录例子,保存用户名和密码到这个应用所在文件中,从文件中读取用户名和密码 1.写登录界面activity_main.xml ...
  • ZZ2713634772
  • ZZ2713634772
  • 2016年08月02日 07:50
  • 2404

oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法

解决过程(所有操作都是操作服务器端的文件路径,不是客户端的文件路径,): 1. 找到listener.ora监听文件,具体位置:E:\Oracle\Server\app\Administrato...
  • wozengcong
  • wozengcong
  • 2013年08月01日 13:20
  • 9569

服务程序中如何以当前登陆用户身份运行程序

开发中有时会遇到这样的问题,当服务程序需要使用某些功能时,由于用户的关系而受到限制, 比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份 去进行操...
  • zwcwu31
  • zwcwu31
  • 2017年02月16日 18:56
  • 162

oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法

早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里。 ...
  • zdx1515888659
  • zdx1515888659
  • 2016年07月08日 14:27
  • 21727
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务程序中如何得到当前登陆用户名(ZZ)
举报原因:
原因补充:

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