- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 C++ 应用程序实时检测登录到 Windows 中的任何新事件。我读到它可以通过使用 wmi 的 ExecNotificationQuery 方法来完成。但是当它尝试它时,我得到了一个访问冲突异常。它有人说应用程序必须具有 SeSecurityPrivilege。现在我如何在创建 wmi 连接时设置此权限。只需忽略 jni 部分,我正在调用声明并将此函数用作 java 的 native 函数
更新代码:
HANDLE hToken = NULL ;
LPCTSTR lpszPrivilege = "SeSecurityPrivilege";
BOOL bEnablePrivilege = true ;
TOKEN_PRIVILEGES tp ;
LUID luid ;
if ( !LookupPrivilegeValue(
NULL,
SE_SECURITY_NAME,
&luid ))
{
cout << "LookupPrivilegeValue error : %u \n" << GetLastError() ;
return ;
}
tp.PrivilegeCount = 1 ;
tp.Privileges[0].Luid = luid ;
if( bEnablePrivilege )
{
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
}
else
{
tp.Privileges[0].Attributes = 0 ;
}
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY , & hToken ))
{
cout << "erroe in open process %u\n" << GetLastError();
return ;
}
if( !AdjustTokenPrivileges(
hToken,
FALSE ,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL ))
{
cout << "AdjustTokenPrivileges error : %u\n" << GetLastError();
return;
}
if(GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
cout << "The token does not have the specified privilege \n" ;
return ;
}
// Initializing the COM
HRESULT hr ;
hr = CoInitializeEx( 0 , COINIT_MULTITHREADED );
if(FAILED(hr))
{
cout << "first failed to initialize COM Library " << hex << hr << endl ;
return ;
}
//Initialize COM security
hr = CoInitializeSecurity (
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IDENTIFY,
NULL,
EOAC_NONE,
NULL
);
if(FAILED(hr))
{
cout << "second failed to initilize security."<< hex << hr << endl ;
CoUninitialize();
return ;
}
cout << "Initilized the COM"<< endl ;
//Initializing the IWbemLocator throught a call to CoCreateInstance.
IWbemLocator *pLoc = 0 ;
hr = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID*) & pLoc);
if(FAILED(hr))
{
cout << "failed to create IWbemLocator object"<< hex << hr << endl ;
CoUninitialize();
return ;
}
//Connect to WMI through a call to ConnectServer method of IWbemLocator
IWbemServices *pSvc = 0 ;
hr = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc);
if(FAILED(hr))
{
cout << "could not connect to WMI from ConnectServer method"<<hex<<hr<<endl;
pLoc->Release();
CoUninitialize();
return ;
}
cout << "Connected to WMI" << endl ;
//Setting security level on a Wmi connection
hr = CoSetProxyBlanket(pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if(FAILED(hr))
{
cout << "could not set security level on wmi connection" << hex << hr << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ;
}
cout << "Security level set on wmi connection" << endl;
// Querying for data using executeQuery Method of IWbemServies pointer
IEnumWbemClassObject* pEnumerator = NULL ;
hr = pSvc->ExecNotificationQuery (
bstr_t("WQL"),
//bstr_t(Cquery),
bstr_t("select * from __InstanceCreationEvent where TargetInstance ISA 'Win32_NTLogEvent'"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if(FAILED(hr))
{
cout << "Query for operating system failed for Win32_NTLogEvent" << hex << endl ;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ;
}
cout << "data is obtained from the operating system" << endl ;
//Getting the data from the query for Win32_NTLogEvent
IWbemClassObject *pclsobj = NULL ;
ULONG uReturn = 0 ;
string logname ; int lognum = 0 ;
while (pEnumerator && lognum < 2 )
{
lognum++ ;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE,1,&pclsobj,&uReturn);
if( 0 == uReturn )
{
cout << "loop broke" << endl ;
cout << "uReturn value :" << uReturn << endl ;
break;
}
cout << "uReturn value :" << uReturn << endl ;
VARIANT vtProp;
string Properties[11] = {"ComputerName" , "Message" , "Logfile" , "SourceName" , "Type" , "EventCode" , "EventIdentifer" , "EventType" , "RecordNumber" , "TimeGenerated" , "TimeWritten"};
int index = 0 ;
for( index = 0 ; index < 11 ; index++ )
{
LPWSTR prop ;
std::wstring property(Properties[index].begin() , Properties[index].end()) ;
prop = (LPWSTR) property.c_str();
hr = pclsobj->Get(prop, 0 , &vtProp , 0 , 0 );
if(index < 5 )
{
cout << "getting property" << endl ;
BSTR bpropertyvalue = vtProp.bstrVal ;
cout << Properties[index] << "reached here" << endl ;
std::wstring wpropertyvalue(bpropertyvalue,SysStringLen(bpropertyvalue));**the crash occurs in this point** //CONVERTING BSTR TO WSTRING
cout << Properties[index] << "reached here again" << endl ;
string propertyvalue(wpropertyvalue.begin(),wpropertyvalue.end());
propertyvalue.assign(wpropertyvalue.begin(),wpropertyvalue.end()); //CONVERTING WSTRING TO C++ STRING
cout << Properties[index] << ":" << propertyvalue << endl ;
VariantClear(&vtProp);
}
else if( index < 9 )
{
int propertyvalue ; //CONVERTING UINT TO INT
if( index == 5 )
{ propertyvalue = vtProp.uiVal ;}
else if(index == 6 )
{ propertyvalue = vtProp.ulVal ;}
else if(index == 7)
{ propertyvalue = vtProp.intVal ;}
else
{ propertyvalue = vtProp.ulVal ; }
cout << Properties[index] << ":" << propertyvalue << endl ;
VariantClear(&vtProp);
}
else
{
CString gendate(vtProp);
cout << " gendate : " << gendate << endl ;
string s(gendate);
string year(s,0,4);
string month(s,4,2);
string day(s,6,2);
string hour(s,8,2);
string minute(s,10,2);
string sec(s,12,2);
string millisec(s,15,6);
struct tm t = {0} ;
stringstream yearstrm(year) ;
int yr = 0 ; yearstrm >> yr ;
stringstream monthstrm(month) ;
int mn = 0 ; monthstrm >> mn ;
stringstream daystrm(day) ;
int dy = 0 ; daystrm >> dy ;
stringstream hourstrm(hour) ;
int hr = 0 ; hourstrm >> hr ;
stringstream minstrm(minute) ;
int min = 0 ;minstrm >> min ;
stringstream secstrm(sec) ;
int sc = 0 ;secstrm >> sc ;
stringstream millisecstrm(millisec) ;
int msec = 0 ; millisecstrm >> msec ;
t.tm_year = yr-1900 ;
t.tm_mon = mn-1 ;
t.tm_mday = dy ;
t.tm_hour = hr ;
t.tm_min = min ;
t.tm_sec = sc ;
time_t time = mktime(&t) * 1000 + msec ;
cout << yr <<"-" << mn <<"-" << dy << "-" << hr << ":" << min << ":" << sc << endl ;
stringstream timegen ;
timegen << time ;
std::string timestr = timegen.str() ;
cout << timestr << endl ;
VariantClear(&vtProp);
}
}
//cout << "---------------------------------------------" << endl ;
最佳答案
获取权限通常包括 3 个步骤:查询权限 LUID、获取允许调整权限的入口 token 句柄、调整权限。
// Fill struct.
::TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(FALSE == ::LookupPrivilegeValueW(nullptr, SE_SECURITY_NAME, ::std::addressof(tkp.Privileges[0].Luid)))
{
// Handle error...
}
// Obtain current process (pseudo) handle.
auto const this_process_handle{::GetCurrentProcess()};
assert(reinterpret_cast<::HANDLE>(-1) == this_process_handle); // No need to call CloseHandle.
// Obtain privilege token for this process.
::HANDLE naked_token_handle{};
constexpr ::DWORD const access_flags{TOKEN_ADJUST_PRIVILEGES bitor TOKEN_QUERY};
if(FALSE == ::OpenProcessToken(this_process_handle, access_flags, ::std::addressof(naked_token_handle)))
{
// Handle error...
}
assert(NULL != naked_token_handle); // Must call CloseHandle to cleanup.
// Enable privilege.
if(FALSE == ::AdjustTokenPrivileges(naked_token_handle, FALSE, ::std::addressof(tkp), 0, nullptr, nullptr))
{
// Handle error and close handle...
}
if(FALSE = ::CloseHandle(naked_token_handle))
{
// Handle error...
}
关于c++ - 如何在 C++ 中获取 Wmi 连接的 SeSecurityPrivilege,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881528/
对于 Windows,我可以使用哪些与 WMI 的监视和系统管理功能类似的其他框架或编程语言? 最佳答案 最能与 WMI 的性能监控功能相媲美的是 SNMP (Simple Network Manag
我的客户有一个旧的基于 DOS 的应用程序,它将格式化的输出发送到打印机。我已禁用打印,因此假脱机文件仍保留在打印队列中。我想拿起这些假脱机文件并将它们转换为 PDF 格式(然后最好删除它们)。这可能
给定一个查询,例如 SELECT * FROM WIN32_PROCESS 有没有办法查询结果对象的返回列的名称? 将结果对象中的所有行写入文本文件,例如 最佳答案 Is there a way to
谷歌让我失望,我在 MSDN 上找不到它。 man wmi在 Windows shell 上不起作用... 我正在寻找可以查询的对象列表,以及如何构建查询。 使用 WMI 我的意思是查询语言来查询诸如
我使用 .Net Framework SDK 中的 MgmtClassGen.exe 为 BizTalk 工件(例如主机、主机实例等)生成一些 WMI 包装器类。 我正在使用 HostSetting.
我正在尝试使用 WMI 获取连接到 Windows XP 计算机的硬件打印机列表。我想要的与从 Win32_Printers 获取列表不同,因为我只想获取物理上以盒子形式存在的打印机,从而消除所有“打
我查看了“root\virtualization”命名空间中的几个对象,但我无法找到 Hyper-V 存储给定虚拟机配置文件路径的位置。我需要以编程方式获取此文件路径,或者至少只是给定虚拟机的主路径也
这些都驻留在 root\RSOP\Computer 命名空间中。我得到非空结果的唯一类是 RSOP_RegistryPolicySetting ,而那个只给了我 Windows 更新和系统还原配置的设
有没有办法通过 WMI 创建/删除磁盘分区?我已经能够挂载/卸载虚拟磁盘 (vhd) 并列出它们的分区。 最佳答案 据我所知,在 WMI 中无法创建/删除分区。您可能想查看 Shell Functio
是否有用于 WMI/WBEM 的 OLEDB 提供程序? 换句话说,有人可以通过以下方式访问 WMI: shell vbscript 中的 ADO ASP 脚本中的 ADO Win32 native
我正在尝试破译 SecurityCenter.productState WMI 命名空间中的 productState 属性。 例如,产品状态是一个整数:262144 - 然后您可以查看此文档页面,将
最近很多用户在使用电脑的时候发现了wmi provider host进程占用内存比较大,不知道这个进程到底是干什么的,能不能禁止,怎么禁止。下面来一起看看想想的介绍吧。 wmi provide
我很难过,似乎无法找到明确的答案。我正在尝试通过 WMI 获取网络适配器列表。我一直在使用的命令在我们办公室的几乎所有工作站上都运行良好,没有任何问题。昨天,问题。一台机器出故障。由于它直接在用户
首先,我想说谢谢你帮我解决这个问题。非常感谢您付出的时间和努力。 标题总结得很好,但我将提供一些细节。基本上,如果我使用 C# 提取操作系统版本,它会返回适用于 Windows 8 的结果 6.2,即
我正在检测我是否正在尝试与本地主机建立连接,并创建(或不创建)WMI 连接选项,如下所示: if (NetworkUtils.IsLocalIpAddress(machineName)) {
我们如何枚举所有网络连接,以便使用 WMI 提取 VPN 连接的 IP 地址?在 XP 上,Win32_NetworkAdapterConfiguration 工作正常,但在 Vista 上它似乎只枚
我想使用 WMI(在 C++ 中)来配置静态 IPv6 地址。 使用 EnableStatic 配置静态 IPv4 地址工作正常,它是名为 Win32_NetworkAdapterConfigurat
我用这里的安装程序安装了wmi http://timgolden.me.uk/python/wmi/index.html但我无法导入模块。 这是我的代码: import wmi c=wmi.WMI()
当我尝试这样做时 SetDynamicDNSRegistration(True) 它返回“68”,我在 MSDN WMI page 上查找过它它的意思是“输入参数无效”。 完整脚本 import wm
我尝试使用 convert-vhd 命令将 VHD 转换为 VHDX,但出现以下错误: The Hyper-V Management Tools could not access an expecte
我是一名优秀的程序员,十分优秀!