任务管理器-----获取进程对应的用户名

LPCTSTR GetProcessUserName(DWORD dwID)     // 进程ID
{
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwID);
if( hProcess==NULL )
return NULL;

HANDLE hToken    =NULL;
BOOL bResult    =FALSE;
DWORD dwSize    =0;

static TCHAR szUserName[256]={0};
TCHAR szDomain[256]={0};
DWORD dwDomainSize=256;
DWORD dwNameSize=256;

SID_NAME_USE    SNU;
PTOKEN_USER pTokenUser=NULL;
__try
{
if( !OpenProcessToken(hProcess,TOKEN_QUERY,&hToken) )
{
bResult = FALSE;
__leave;
}

if( !GetTokenInformation(hToken,TokenUser,pTokenUser,dwSize,&dwSize) )
{
if( GetLastError() != ERROR_INSUFFICIENT_BUFFER )
{
bResult = FALSE ;
__leave;
}
}

pTokenUser = NULL;
pTokenUser = (PTOKEN_USER)malloc(dwSize);
if( pTokenUser == NULL )
{
bResult = FALSE;
__leave;
}

if( !GetTokenInformation(hToken,TokenUser,pTokenUser,dwSize,&dwSize) )
{
bResult = FALSE;
__leave;
}

if( LookupAccountSid(NULL,pTokenUser->User.Sid,szUserName,&dwNameSize,szDomain,&dwDomainSize,&SNU) != 0 )
{
return szUserName;
}
}
__finally
{
if( pTokenUser!=NULL )
free(pTokenUser);
}

return NULL;
}

注:1.目前仅能获取
Administrator,SYSTEM用户名。
      2.LOCAL SERVICE 和 NETWORK SERVICE的用户名获取不到。
//为什么不能获取呢?

发现是本程序的权限不够。所以调用如下方法提升权限。。。。

BOOL CDialog2::EnableDebugPrivilages()
{
 HANDLE hToken;
 LUID sedebugnameValue;
 TOKEN_PRIVILEGES tp;
 
 
 if (!::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
 {
  return FALSE;
 }
 
 if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue ))
 {
  ::CloseHandle( hToken );
  return FALSE;
 }
 
 tp.PrivilegeCount = 1;
 tp.Privileges[0].Luid = sedebugnameValue;
 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
 if(AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL ))
 {
  ::CloseHandle(hToken);
  return FALSE;
 }
 
 return TRUE;
 
}

 

//======================================================================//

上面的方法比较繁琐,下面有个简单办法。请看。

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
 DWORD dwProcessId = 1832;
 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION , FALSE, dwProcessId);
 HANDLE hToken;
 if (NULL == hProcess)
 {
  wcout << L"OpenProcess is failed" << endl;
 }

 BOOL bRet = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
 if (FALSE == bRet)
 {
  wcout << L"OpenProcessToken is failed" << endl;
 }

 TCHAR tkUser[MAX_PATH];
 DWORD dwRetLen;
 // 第一次调用GetTokenInformation是为了获取PTOKEN_USER需要分配多大的空间
 bRet = GetTokenInformation(hToken, TokenUser, NULL, 0, &dwRetLen);
 

 PTOKEN_USER pToken = new TOKEN_USER[dwRetLen];
 bRet = GetTokenInformation(hToken, TokenUser, pToken, dwRetLen, &dwRetLen);

 TCHAR szUserName[MAX_PATH];
 DWORD dwUserNameSize;
 TCHAR szDomainName[MAX_PATH];
 DWORD dwDomainNameSize;
 SID_NAME_USE  snu;
 bRet = LookupAccountSid(NULL, pToken->User.Sid,
  szUserName, &dwUserNameSize,
  szDomainName, &dwDomainNameSize,
  &snu);

 wcout << szUserName << endl;
 wcout << szDomainName << endl;
 return 0;
}

 

另外有2篇博文链接,比较好,我就直接帖地址了。

http://topic.youkuaiyun.com/u/20110429/16/62b2efea-0b3a-4bae-afb0-391c9e98814d.html

http://hi.baidu.com/tr0j4n/blog/item/7531a62a613e12f0e6cd400a.html

### 如何使用 `nvidia-smi` 和 `kill -9` 终止指定 GPU 的进程 在处理 GPU 占用问题时,可以结合 `nvidia-smi` 工具来识别并终止特定的 GPU 进程。以下是具体方法: #### 使用 `nvidia-smi` 查找 GPU 上的进程 `nvidia-smi` 是 NVIDIA 提供的一个工具,用于监控和管理 GPU 资源。可以通过以下命令获取当前正在使用的 GPU 及其对应进程 ID (PID) 列表: ```bash nvidia-smi ``` 该命令会显示 GPU 当前的状态以及哪些进程正在占用它。如果发现某些进程不需要继续运行,则记录下它们的 PID。 #### 手动杀死单个进程 对于已知的某个具体的 PID,可以直接通过 `kill -9` 命令强制结束此进程: ```bash kill -9 <pid> ``` #### 自动化批量杀掉所有相关进程 当存在多个需要清理的进程时,手动操作效率较低。此时可利用脚本实现自动化清除功能。下面是一条能够一次性删除所有与目标设备有关联的所有活动线程的一行式解决方案: ```bash fuser -v /dev/nvidia* | awk '{for(i=1;i<=NF;i++) print "kill -9 ", $i}' | bash ``` 这条指令的工作原理如下: - **`fuser -v /dev/nvidia*`**: 显示正访问 `/dev/nvidia*` 设备文件的所有 PIDs。 - **`awk '{for(i=1;i<=NF;i++) print "kill -9 ", $i}'`**: 遍历每一个字段(即每个 PID),构建出相应的 `kill -9` 命令字符串。 - **`bash`**: 将前面生成的所有 `kill -9` 指令逐一执行。 另外一种方式则是基于用户名筛选对应用户的全部作业项再统一销毁之: ```bash pgrep -u username | xargs kill -9 ``` 这里需要注意替换实际登录系统的账户名至上述位置处完成适配调整[^2]。 以上两种方案均能有效应对多数量级规模下的资源回收需求场景。 #### 特殊情况说明 有时即使看不到任何明确标记出来的应用层面上的任务实体仍然可能存在隐匿型后台服务持续霸占着硬件计算单元的情况发生;这可能是由于之前错误地采用了 Ctrl+Z 键组合暂停而非真正意义上的停止某段长时间运算逻辑所引发的结果所致——这种情形下务必记得改回采用标准中断信号 Ctrl+C 来即时打断正在进行中的流程以免遗留下来不必要的负担影响后续正常使用体验效果[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值