阅读:4509回复:6
在内核里怎么获取进程的用户名?
UNICODE_STRING *GetProcessUsername()
{ HANDLE token; TOKEN_USER* TokenUser = NULL; NTSTATUS status; //PULONG len; //int index; //SID *sid; LUID luid; UNICODE_STRING userName; PSecurityUserData userInformation = NULL; status=ZwOpenProcessTokenEx(NtCurrentProcess(), GENERIC_READ, OBJ_KERNEL_HANDLE, &token); //ZwQueryInformationToken(token, (TOKEN_INFORMATION_CLASS)TokenUser, NULL, 0, &len); //to get required length if (!NT_SUCCESS(status)) { KdPrint(("ZwOpenProcessTokenEx(): ZwOpenProcessTokenEx fail\n")); return NULL; } //sid= (SID*)TokenUser->User.Sid; // status = SeQueryAuthenticationIdToken(token, &luid); if (!NT_SUCCESS(status)) { KdPrint(("SeQueryAuthenticationIdToken(): SeQueryAuthenticationIdToken fail\n")); return NULL; } status = GetSecurityUserInfo(&luid, UNDERSTANDS_LONG_NAMES, &userInformation); if (!NT_SUCCESS(status)) { KdPrint(("GetSecurityUserInfo(): GetSecurityUserInfo fail\n")); return NULL; } userName.Length = 0; userName.MaximumLength = userInformation->UserName.Length; userName.Buffer = ExAllocatePool(NonPagedPool, userName.MaximumLength); if (userName.Buffer==NULL) { KdPrint(("GetUserName(): ExAllocatePool fail\n")); return NULL; } RtlCopyUnicodeString(&userName, &userInformation->UserName); return &userName; } 这个函数一执行就蓝屏 调试了一下问题在 SeQueryAuthenticationIdToken 这个函数上 很着急啊,明天就要交货了, 那位大侠帮帮我!!!!!!!!!!!!!!!!!!!!! |
|
沙发#
发布于:2010-03-15 17:37
znsoft大侠,能指点一下吗
|
|
板凳#
发布于:2010-03-15 17:39
lz我也是和你做一样的东西 现在遇到一样的情况 需要得到用户名 可是GetSecurityUserInfo这个函数一直报错 我是新手麻烦楼主给我讲下怎么加ksecdd.lib 我加了就一堆错 谢谢啦 这个函数过了我就能调了 到时一起调啊
|
|
地板#
发布于:2010-03-15 17:43
hudson0201能指点下 大家一起调啊
|
|
地下室#
发布于:2010-03-15 17:51
我找到个办法先用RtlAllocateAndInitializeSid再用SecLookupAccountSid刚好准备试 我要下班了 楼主联系我啊 帮帮我吧
|
|
5楼#
发布于:2010-03-15 21:48
回 2楼(firstforyou) 的帖子
你的代码目录下有个文件叫source在里面仿造其他的Lib加入 这个库就可以了 |
|
6楼#
发布于:2010-03-15 22:03
|
|