如何检查进程是否属于当前用户?

2023-12-25

我正在尝试获取属于当前用户的进程的 PID,但我不知道如何检查进程所有者。

这是我的代码(缺少用户的检查条件):

uses
  TlHelp32, ...;

type
  TCardinalArray = array of Cardinal;

function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray;
var
  ContinueLoop: boolean;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  SetLength(Result, 0);
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while(ContinueLoop) do
  begin
    if(SameText(FProcessEntry32.szExeFile, AProcessName)) then
    begin
      if((* is this my process? *)) then
      begin
        SetLength(Result, Length(Result) + 1);
        Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID;
      end;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

我找到了一个从 PID 获取用户和域 http://www.swissdelphicenter.ch/en/showcode.php?id=2113功能,可以轻松完成任务。

正如 Sertac Akyuz 所建议的,该函数使用开放进程令牌 https://msdn.microsoft.com/it-it/library/windows/desktop/aa379295(v=vs.85).aspx and 获取Token信息 https://msdn.microsoft.com/it-it/library/windows/desktop/aa446671(v=vs.85).aspx。它还使用查找AccountSid https://msdn.microsoft.com/it-it/library/windows/desktop/aa379166(v=vs.85).aspx:

uses
  TlHelp32;

type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;

function GetUserAndDomainFromPID(ProcessId: DWORD;
  var User, Domain: string): Boolean;
var
  hToken: THandle;
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  snu: SID_NAME_USE;
  ProcessHandle: THandle;
  UserSize, DomainSize: DWORD;
  bSuccess: Boolean;
begin
  Result := False;
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
  if ProcessHandle <> 0 then
  begin
  //  EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
    if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
    begin
      bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
      ptiUser  := nil;
      while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
      begin
        ReallocMem(ptiUser, cbBuf);
        bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
      end;
      CloseHandle(hToken);

      if not bSuccess then
      begin
        Exit;
      end;

      UserSize := 0;
      DomainSize := 0;
      LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
      if (UserSize <> 0) and (DomainSize <> 0) then
      begin
        SetLength(User, UserSize);
        SetLength(Domain, DomainSize);
        if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize,
          PChar(Domain), DomainSize, snu) then
        begin
          Result := True;
          User := StrPas(PChar(User));
          Domain := StrPas(PChar(Domain));
        end;
      end;

      if bSuccess then
      begin
        FreeMem(ptiUser);
      end;
    end;
    CloseHandle(ProcessHandle);
  end;
end;

然后我编写了一个函数来获取当前的 Windows 用户名(它使用获取用户名 https://msdn.microsoft.com/it-it/library/windows/desktop/ms724432(v=vs.85).aspx):

const
  UNLEN = 256; // Maximum user name length

function GetWindowsUsername: string;
var
  UserName : string;
  UserNameLen : Dword;
begin
  UserNameLen := UNLEN;
  SetLength(UserName, UserNameLen) ;
  if GetUserName(PChar(UserName), UserNameLen)
  then Result := Copy(UserName, 1, UserNameLen - 1)
  else Result := '';
end;

以下函数返回一个由属于当前用户的所有进程 id 组成的数组(请注意,进程是按进程名称过滤的):

uses
  TlHelp32;

type
  TCardinalArray = array of Cardinal;

function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray;
var
  ContinueLoop: boolean;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  UserName : string;
  DomainName : string;
  CurrentUser : string;
begin
  CurrentUser := GetWindowsUsername();

  SetLength(Result, 0);
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while(ContinueLoop) do
  begin
    if(SameText(FProcessEntry32.szExeFile, AProcessName)) then
    begin
      if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then
      begin
        if(UserName = CurrentUser) then
        begin
          SetLength(Result, Length(Result) + 1);
          Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID;
        end;
      end;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查进程是否属于当前用户? 的相关文章

随机推荐

  • 向 SQL Server 中的存储过程添加参数

    我是新来的K2and SQL Server 我想向存储过程添加一个参数 稍后将其绑定到K2相应视图和表单的智能对象 目前它接受 1 个参数 lang 这是来自标签的输入K2智能形式视图 我添加了一个标签labelHideInactiveCo
  • 首次折叠的 K 次折叠精度较低

    我创建了一个文本分类器 并且正在尝试利用 K 折交叉验证 我不明白为什么我的第一次折叠的准确度为 55 而我的其他折叠则在 99 100 的准确度下过度拟合 我的数据集是一个 5109x2 数据框 其中列 df Features 作为特征
  • CS0120:非静态字段、方法或属性“foo”需要对象引用

    考虑 namespace WindowsApplication1 public partial class Form1 Form public Form1 InitializeComponent private void button1 C
  • 如何使用 OpenCV 从图像中裁剪和提取图章?

    我是 OpenCV 新手 我有一个 简单 的邮票图像 我已经对其进行了一些处理 如下面的代码所示 现在我遇到了裁剪图像以获得印章的问题 边缘上的点和条纹会干扰我当前识别邮票的代码 图像可能不同 因此无法修复图像的位置 Code img cv
  • 循环算法Java实现

    我认为我的问题相当简单 但我觉得我需要一些不同的视角 因为我似乎无法将这个算法转化为代码 我需要制定一个运动队赛程表 其中 n 支球队 在本例中为 10 支球队 以循环赛形式进行比赛 规则遵循基本的循环赛格式 其中一支球队在给定时间只能与另
  • 基于 Woocommerce 中的自定义单选按钮的动态运费

    在 Woocommerce 中 我在结帐页面上添加了两个自定义单选按钮 单击后 我调用 ajax 函数来添加送货费 这是我的代码 document on change shipping method 0 local pickup5 func
  • 如何在 TBody 中将 TH 标头与 TD 对齐

    我在尝试使用一些 CSS 将表格嵌入现有 HTML 页面时遇到问题 默认情况下 此 CSS 隐藏表格的标题 其样式定义如下 tablestuff thead display none 但我希望显示表格 所以我尝试使用 display blo
  • Visual Studio 2017 安装中断:无法启动

    我使用管理员权限安装vs enterprise exe 但安装包根本不起作用 操作系统 win10专业版 appdata local temp 中的安装日志如下 dd bootstrapper 20170313103210 日志的开头 开始
  • Woocommerce:仅显示同一子类别的相关产品

    相关产品是从您的商店中提取与当前产品具有相同标签或类别的其他产品的部分 src Woocommerce 文档 http docs woothemes com document related products up sells and cr
  • Cordova 应用程序中的 HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)

    我使用 Cordova 3 2 和 jquery mobile 1 3 创建了一个 iOS 应用程序 我使用 jquery ajax 向 RESTfull 服务发送请求以检索 更新信息 我有很多测试设备 各种 iPhone 具有各种不同的
  • Xcode 11 中如果没有更多上下文,表达式类型不明确

    我想参考一个 Item 列出一个内 EnvironmentObject但是当在一个范围内访问它时SwiftUI List 我收到错误 我不明白的是 执行以下操作时不会弹出此错误Apple 的 Landmark 教程 https develo
  • MPRemoteCommandCenter 对 MPMusicPlayerController 不执行任何操作

    我一直在编写使用的代码 MPMusicPlayerController applicationMusicPlayer 演奏音乐 此操作已成功运行 并将在控制中心屏幕上显示当前播放曲目的详细信息 不幸的是 我似乎无法从控制中心屏幕或耳机中使用
  • Rails、jQuery、.js.erb 文件、JS 不被浏览器执行

    我正在尝试使用 jQuery 一切都很棒 直到现在 当我尝试渲染部分并将其附加到 div 时 这是我的设置方法 我有一个响应 js 的操作 def index objects Object find all respond to do fo
  • 如何使用 powershell 脚本在 CSV 文件顶部添加新行?

    我是 powershell 脚本编写的新手 我正在寻找一种方法在现有 csv 文件的顶部添加 2 个新行 我尝试过的事情是用新行替换标题和行 我正在寻找一种在 CSV 标题上方添加 2 个新行的方法 您提到您要添加新行above标头 这意味
  • Symfony $request->isXmlHttpRequest() 问题

    我需要检查请求是否是ajax request gt isXmlHttpRequest 工作正常 但是如果在执行过程中某个地方有重定向 此方法将返回 false 在这种情况下我还能如何检查请求是否是ajax 附注ajax是由jQuery发起的
  • 如何调用请求标头上需要不记名令牌的 NSwag 客户端方法?

    我没有确切了解 NSwag 如何与 IdentityServerX 不记名令牌交互并按常规添加请求标头 据我了解 我的主机 api 应用程序使用 LDAP 身份验证实现了 IdentityServer3 如果任何主机需要令牌进行身份验证 则
  • 在 R 中以日期为 X 轴绘图

    我以电子方式维护我的日记 我试图了解过去几个月我的日记写作的一致性 我有以下数据文件 显示有多少日记帐分录 Entry Count 和单词 Word Count 我记录了之前 30 天的时间 Date Entry Count Word Co
  • 在 Windows 上将 filesystem::path 转换为 char*

    The C 17 文件系统 https en cppreference com w cpp filesystem基于boost filesystem 我现在在 Windows 上使用 VS2017 include
  • sqlserver 中的 CONVERT 问题,出现 Msg 529 错误

    select CONVERT datetime value 103 from results 这个声明给了我一个错误 Msg 529 Level 16 State 2 Line 1 Explicit conversion from data
  • 如何检查进程是否属于当前用户?

    我正在尝试获取属于当前用户的进程的 PID 但我不知道如何检查进程所有者 这是我的代码 缺少用户的检查条件 uses TlHelp32 type TCardinalArray array of Cardinal function GetCu