菜鸟在线请教问题,请高手帮忙

1111111 2006-01-18 02:18:40
//获取win2000登陆用户
BOOL CSecurityTool::GetLogUser2K(CString& strName)
{
BOOL bRet = FALSE;
HANDLE hSnapshot = NULL;
strName = _T("");

__try
{
// Get a snapshot of the processes in the system
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == NULL)
{
__leave;
}

PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);

// Find the "System" process
BOOL fProcess = Process32First(hSnapshot, &pe32);
while (fProcess)
{
if (lstrcmpi(pe32.szExeFile, TEXT("explorer.exe")) == 0)
{
TCHAR szUserName[MAX_PATH];
if (GetProcessUser(pe32.th32ProcessID, szUserName, MAX_PATH))
{
bRet = TRUE;
strName = szUserName;
}

break;
}
fProcess = Process32Next(hSnapshot, &pe32);
}
if (!fProcess)
{
__leave; // Didn''t find "System" process
}
}
__finally
{
// Cleanup the snapshot
if (hSnapshot != NULL)
CloseHandle(hSnapshot);
}

return bRet;
}

//获取进程的用户名
BOOL CSecurityTool::GetProcessUser(DWORD dwProcessID, TCHAR *szUserName, DWORD nNameLen)
{
BOOL fResult = FALSE;
HANDLE hProc = NULL;
HANDLE hToken = NULL;
TOKEN_USER *pTokenUser = NULL;

__try
{
// Open the process with PROCESS_QUERY_INFORMATION access
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);
if (hProc == NULL)
{
__leave;
}
fResult = OpenProcessToken(hProc, TOKEN_QUERY, &hToken);
if(!fResult)
{
__leave;
}

DWORD dwNeedLen = 0;
fResult = GetTokenInformation(hToken,TokenUser, NULL, 0, &dwNeedLen);
if (dwNeedLen > 0)
{
pTokenUser = (TOKEN_USER*)new BYTE[dwNeedLen];
fResult = GetTokenInformation(hToken,
TokenUser,
pTokenUser,
dwNeedLen,
&dwNeedLen);
if (!fResult)
{
__leave;
}
}
else
{
__leave;
}

SID_NAME_USE sn;
TCHAR szDomainName[MAX_PATH];
DWORD dwDmLen = MAX_PATH;
fResult = LookupAccountSid(NULL,
pTokenUser->User.Sid,
szUserName,
&nNameLen,
szDomainName,
&dwDmLen,
&sn);
}
__finally
{
if (hProc)
::CloseHandle(hProc);
if (hToken)
::CloseHandle(hToken);
if (pTokenUser)
delete[] (char*)pTokenUser;

return fResult;
}
}

这2个类是什么啊?自定义的?还是本身就可以直接用的?要怎样定义啊?我想得到用户名为什么还要输入参数?搞不懂.请高手能否告诉我下,怎样调用这2个类啊.或者怎样改.具体点,谢谢了.分少,不胜感激.
...全文
132 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
快乐鹦鹉 2006-01-19
肯定是自定义的。
回复
Mr_Yang 2006-01-19
mark
回复
1111111 2006-01-19
请问能详细告诉我一下步骤么?

能告诉我怎样现实得到的用户名么?
基于对话框的MFC.EXE
在里边画一个输入框.界面启动时,在输入框中显示得到的用户名?

请告诉一下主要的步骤代码,谢谢了.
回复
guoxiaoli 2006-01-19
应该是自定义的吧!在Visual Studio 6.0中没有这个类

首先强调这是CSecurityTool类的两个成员函数,

1。调用CSecurityTool::GetLogUser2K(CString& strName)


CSecurityTool st;
st.GetLogUser2K(&str);// str用来把win2000登陆用户名存放在这个字符串中

因为 strName = szUserName; 这条语句

2。BOOL CSecurityTool::GetProcessUser(DWORD dwProcessID, TCHAR *szUserName, DWORD nNameLen)

DWORD dwProcessID 是进程标识符 OpenProcess函数中使用
TCHAR *szUserName 指向用户名的字符串指针 LookupAccountSid函数中使用
DWORD nNameLen 用户名长度的限制 LookupAccountSid函数中使用



这两个函数可以当作思路借鉴一下,不一定非要用他的方法!
回复
ma100 2006-01-18
不是输入参数,而是通过地址传递参数而已,返回值即参数
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2006-01-18 02:18
社区公告
暂无公告