如题win7操作系统,写了个dll被SNMP服务加载,打算调用WTSQueryUserToken得到令牌,
用来CreateProcessAsUser。结果返回ERROR_PRIVILEGE_NOT_HELD。对win7用户权限机制不太熟悉,
请问这个问题该怎么解决啊?
用来CreateProcessAsUser。结果返回ERROR_PRIVILEGE_NOT_HELD。对win7用户权限机制不太熟悉,
请问这个问题该怎么解决啊?
To call this function successfully, the calling application must be running within the context of the LocalSystem account and have the SE_TCB_NAME privilege. ------from MSDN从资源管理器可以看到该服务运行于system账户,session 0。我看看有没有办法确定该服务是否有SE_TCB_NAME权限。
下的RequiredPrivileges项,这里应该是修改service特权的,我加入了SeTcbPrivilege,
用sc qprivs SNMP命令,可以查看特权列表,也是可以查到增加了eTcbPrivilege的,但是
procexp下仍然看不到snmp服务有该特权,并且WTSQueryUserToken仍然返回ERROR_PRIVILEGE_NOT_HELD。
同时,我也尝试了在本地策略用户权限分配的以操作系统方式执行,仍然不行。
重启过也都不行。继续跟进
与驱动通信,不是用 CreateFile 加 DeviceIoControl 吗?
debug
create token
take ownership
你看你有几个
没错,SNMP服务本身是socket通信。但是重新写一套服务检测、上报等于是重做了一遍SNMP协议,windows做好了现成的snmp服务没道理不借用。windows SNMP服务本身已经做好了用户扩展接口,我只要做一个dll并实现init、query、close等接口并在注册表中把该dll和snmp注册就会被snmp服务加载。CreateFile 加 DeviceIoControl是可以访问设备驱动,但是显卡等设备有自己成熟的api。而且win7操作系统是服务和application进行了session隔离,服务无法直接访问驱动,即使用DeviceIoControl也无法穿透session隔离。服务中拿到桌面token并创建子进程调用驱动,然后与子进程进行通信是Impact of Session 0 Isolation on Services and Drivers in Windows Vista这篇微软官方文档给出的方案。
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\
00,6e,00,6d,00,70,00,2e,00,65,00,78,00,65,00,00,00
"DisplayName"="SNMP Service"
"ObjectName"="LocalSystem"
"Description"="@%SystemRoot%\\system32\\snmp.exe,-4"
"ServiceSidType"=dword:00000001
"FailureActions"=hex:80,51,01,00,00,00,00,00,01,00,00,00,03,00,00,00,14,00,00,\
00,01,00,00,00,60,ea,00,00,01,00,00,00,60,ea,00,00,00,00,00,00,00,00,00,00
"RequiredPrivileges"=hex(7):53,00,65,00,54,00,63,00,62,00,50,00,72,00,69,00,76,\
00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,00,4c,00,6f,00,61,00,64,00,\
44,00,72,00,69,00,76,00,65,00,72,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,\
00,67,00,65,00,00,00,00,00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters]
"NameResolutionRetries"=dword:00000010
"EnableAuthenticationTraps"=dword:00000001[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\ExtensionAgents]
"snmptools"="SOFTWARE\\snmptools\\CurrentVersion"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\PermittedManagers]
"1"="10.7.5.18"
"2"="localhost"
"3"="10.7.5.6"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent]
"sysServices"=dword:0000004c
"sysLocation"=""
"sysContact"=""[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration][HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public]
"1"="localhost"
"2"="10.7.5.5"
"3"="10.7.5.18"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\testxie]
"1"="10.7.5.6"
"2"="localhost"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\ValidCommunities]
"public"=dword:00000008
"testxie"=dword:00000008
SeLoadDriverPrivilege
既然Windows提供这种支持,不应该出现问题啊我baidu了一下,没清楚 SNMP服务是啥,
你的dll在 Server 端 还是在 client端?
因为进程一旦启动,就不能增加新的privilege。
so, 这个是策略吗,设置以后每次启动这个服务就要包含某个指定这个特权?说真的,Windows 7 已经慢慢的如xp那样普及了。
很多新问题,还真是不好找答案(因为你不知道你不知道什么)。
你写的扩展DLL的接口是谁来调用,snmp服务?snmp陷阱服务?无所谓,那么是谁引起了这样一个调用?我根据自己的理解,应该是机器A,与机器B的snmp服务通信,最终落到你的dll上
不知道我的理解对不对,如果对的话,感觉就像是 客户端程序在调用 WebService. SNMP服务就相当于IIS服务,你写的dll就相当于.asmx(编译后得到的.dll)……如果不对的话:
如果是由.dll所在机器本地程序调用的话,我还真不理解……-_-如果是由.dll被加载后,创建线程,然后在线程内获取设备信息,在发给监管服务器端。如果是这样。服务器端你用的是神马接口来接受回报信息,也是SNMP服务吗?使用socket的程序? 还是在该.dll中直接使用 数据库访问接口?
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<service name>\ RequiredPrivileges是有API去设置服务特权,但本质还是修改注册表,修改特权后在我的程序中不起作用。
客户端用别的方式获取完了后,与服务器端的snmp通信,你写的dll 连接数据库 保存回报数据,这就不需要什么很特殊的特权级了。。你要求现有获取机制不变,并且有现成的库使用,WMI 也很强大远程查询计算机信息。。
为什么不能直接创建一个application,然后service和该进程直接通信,达到目标?
对于我的问题来说,直接创建一个访问驱动的application(不用任何token,就是一个exe程序),然后用snmp service和它通信,就能够要到驱动信息了。
这样不是也能解决问题了吗?
这个程序不能运行在session 0
然后你的dll可以从这个地方取。。(file mapping ...)不然你就折腾于函数调用的 同步与数据封送 吧
不是和自己写的 文件系统驱动,就是 访问插入的磁盘,没啥意外情况啊。不知道你用的是什么方式……
funa 是在进程B中调用的,得出另一个结构体,在打包传给进程A。A进程超时等待进程B的回应,想象起来很简单,实现起来我花了好久,原因之一就是 没有断开通知,所以并不知道没反应到底是对方死了,还是怎么了。
CreateProcessAsUser来穿透session隔离。所以这个问题不再重要了,snmp服务没有SE_TCB_NAME特权,
才引出了上面这么多讨论。具体我还是想不做成服务,直接做一个application通信就行了。管理员权限还是能够保证的。也不想在通信同步上纠结太多,所以在考虑采用何种进程通信方式来满足我的需求。