哪个windows的安全策略会影响获取进程句柄

upwaker 2009-11-08 09:08:37
我这边用vs2003开发了一个应用程序,初始化时先获取进程名,然后根据进程名获取进程句柄。程序在大部分机器上运行都很正常,但是在客户的某一台机器上(win2000 server)就无法初始化成功,经过调试发现,获取进程名这一步就有问题,很多进程无法获取,返回错误码5,意思是拒绝访问。与客户交流得知该机器特殊点在于做了一些windows2000的安全策略设置。

哪位大侠知道哪个安全策略的设置会导致上层程序获取进程名失败呢,急盼答复,非常感谢。
...全文
126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnuke 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 upwaker 的回复:]
谢谢这位兄弟,这样改的确可以。
但是有无不改代码的解决方法,因为承认代码考虑不周,很有可能会丢掉这单合同的。如果能找到系统设置不当的原因,则事情还有缓和的余地。
[/Quote]

事实就是这样了,你们的代码确实考虑不周全。要么取少点权限(设计问题),要么提升自身权限(代码问题)。
windows调整系统安全策略那是很正常的事情。你可以要求客户关闭那些策略。但是不管怎么养,客户还是觉得你的兼容性不好。
MoXiaoRab 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 upwaker 的回复:]
谢谢这位兄弟,这样改的确可以。
但是有无不改代码的解决方法,因为承认代码考虑不周,很有可能会丢掉这单合同的。如果能找到系统设置不当的原因,则事情还有缓和的余地。
[/Quote]
1年前我就探索过这个问题了,不定性太多.只能通过改代码实现100%的成功率
upwaker 2009-11-09
  • 打赏
  • 举报
回复
谢谢这位兄弟,这样改的确可以。
但是有无不改代码的解决方法,因为承认代码考虑不周,很有可能会丢掉这单合同的。如果能找到系统设置不当的原因,则事情还有缓和的余地。
MoXiaoRab 2009-11-09
  • 打赏
  • 举报
回复
各种安全产品,系统策略.HOTFIX都会影响到句柄的取得.你用上面的那个函数就没有问题了
MoXiaoRab 2009-11-09
  • 打赏
  • 举报
回复
提升下权限就好了


void LookUpProcessPriviege()
{
TOKEN_PRIVILEGES tkp;
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return ;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}


这个函数的调用写在最前面
winnuke 2009-11-09
  • 打赏
  • 举报
回复
OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID[i]); // 我觉得你的问题多半出在这里。
你确认下是否需要这个权限。

如果需要的话,你再提升下自身进程权限。
upwaker 2009-11-09
  • 打赏
  • 举报
回复
不是怕贴代码,我是怕代码上来后把大家的思路引偏了。

------------------------
BOOL CMonitorSQLThread::GetProcHandle(HANDLE& hProcHandle, CString strProcName) const
{
DWORD dwProcID[SQLSERVER_PROCID_NUM] = {0};
DWORD dwNeedSize = 0;
int iCount = 0;
HANDLE hProcess = NULL;
HMODULE hModule = NULL;
TCHAR szModuleName[_MAX_PATH + 1] = {0};

//TCHAR szSQLName[] = _T("sqlservr.exe");
int i = 0;

//获得所有运行进程的进程ID,最多获取1000/4个
if (!EnumProcesses(dwProcID, 1000, &dwNeedSize))
{
W2L(LERR, _T("get %s handle fail(EnumProcesses)!"), strProcName);
return FALSE;
}

iCount = static_cast <int>(dwNeedSize / 4);
if (iCount > SQLSERVER_PROCID_NUM)
{
W2L(LERR, _T("the process num is %d(EnumProcesses)!"), iCount);
iCount = SQLSERVER_PROCID_NUM;
}

//检查所有运行进程的主模块名, 判断进程是否在运行, 如果在,
//获得其进程句柄
for (i = 0; i < iCount; i++)
{
//获得进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID[i]);
if (NULL == hProcess)
{
continue;
}

//获得进程的主模块名称
if (!EnumProcessModules(hProcess, &hModule, sizeof(HMODULE), &dwNeedSize))
{
CloseHandle(hProcess);
continue;
}

dwNeedSize = GetModuleBaseName(hProcess, hModule, szModuleName, _MAX_PATH);
if (0 == dwNeedSize)
{
CloseHandle(hProcess);
continue;
}

szModuleName[dwNeedSize] = _T('\0');
strProcName.MakeLower();

//判读进程是否为输入的进程名称, 如果是获得其进程句柄, 成功返回
CharLower(szModuleName);
if (0 == lstrcmp(szModuleName, (LPCTSTR)strProcName))
{
hProcHandle = hProcess;
return TRUE;
}
else
{
CloseHandle(hProcess);
}
}

W2L(LERR, _T("get %s handle fail!"), strProcName);
return FALSE;
}
winnuke 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 upwaker 的回复:]
经过仔细排查,原因已经找到。安全策略中“用户权利指派”-〉“调试程序”必须给administrator增加权限。客户机器上该项取消了。添加后程序运行正常。

--------
感谢楼上两位的参考建议,散分给两位。
[/Quote]

也就是说普通情况下administrator用户启动的进程是有调试权限的。但是他把该用户从调试权限列表中删除了。要么手动代码提升权限,要么将用户添加到调试权限列表中。

MoXiaoRab 2009-11-09
  • 打赏
  • 举报
回复
学习了.感谢LZ最后的 "啰嗦一句",很受用
upwaker 2009-11-09
  • 打赏
  • 举报
回复
最后再啰嗦一句,其实很多合同/项目不能仅从技术角度来看的,譬如这个项目你不把客户的这个原因找到,单子都丢掉了,哪里还有修改的机会。上午和客户已经沟通过了,客户感谢我们的帮助,承认该项设置不当,我们也退一步,承认代码设计也有不完善的地方,下个版本中改正。双方皆大欢喜,客户的感知还很好,认为我们这边技术很强。
upwaker 2009-11-09
  • 打赏
  • 举报
回复
经过仔细排查,原因已经找到。安全策略中“用户权利指派”-〉“调试程序”必须给administrator增加权限。客户机器上该项取消了。添加后程序运行正常。

--------
感谢楼上两位的参考建议,散分给两位。
winnuke 2009-11-08
  • 打赏
  • 举报
回复
提升自身进程的权限到debug
MoXiaoRab 2009-11-08
  • 打赏
  • 举报
回复
贴点你的代码上来看看就知道了
assicen 2009-11-08
  • 打赏
  • 举报
回复
这个有可能不是代码的问题了 首先也要考虑是否有枚举进程的权限 并且要有对目标运行程序访问的权限

或者换一台WIN2000试试 如果另外一台WIN2000也不行 那可能确实是兼容性有问题

另外有一点你没说清楚 是获得自己本身的进程名和句柄 还是获得远程指定的某个进程的 还是要枚举所有的?

建议LZ把代码贴上来看看
winnuke 2009-11-08
  • 打赏
  • 举报
回复
扯淡~~~~~~~~~~~
上来问就提供下你的代码,这是最起码的。。。。
没人会在乎这点破代码。
MoXiaoRab 2009-11-08
  • 打赏
  • 举报
回复
汗,我又没说要改代码,我只是要看看你代码有哪些行为,这样才能判断出可能的情况

你这人真是
upwaker 2009-11-08
  • 打赏
  • 举报
回复
不能从改代码角度想问题,当然也许你通过这个也能达到目的。
但是现在是客户严重怀疑你程序的兼容性,必须找出他安全策略设置不当的地方,然后展示给他看,是他设置的问题。程序本身的问题不大,然后才能再谈修改的问题。

请各位大侠帮忙分析一下,哪个安全策略会影响进程获取呢。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧