以编程方式通过Winapi编辑Windows审核策略时,权限错误

简洁版本:

我正在尝试编写一个C ++程序,使Windows 8上的进程创build日志logging。我知道这是可以使用auditpol.exe,但我想以编程方式做。 我的研究表明,唯一的方法是通过Windows API命令AuditSetSystemPolicy ,所以我编写了一个调用这个函数的C ++程序(见下文)。 但是,该程序未能引用权限问题(错误代码1314)。 我以pipe理员身份运行Visual Studio,并且尝试在以pipe理员身份运行的命令提示符下执行程序,但是我仍然收到错误消息。

长版本:

下面的程序需要一个GUIDstring来描述我想要开始审计的进程创build子类别 ,并将其转换为一个GUID结构体。 然后它根据GUID和ULONG构造一个AUDIT_POLICY_INFORMATION结构来描述我想做的改变(启用成功和失败login)。 最后,我把结构放入一个数组并调用AuditSetSystemPolicy函数。

// Subcategory GUID for Process Creation string guidstr ("{0CCE922B-69AE-11D9-BED3-505054503030}"); // Construct a GUID object GUID guid; HRESULT hr = CLSIDFromString(s2ws (guidstr).c_str(), (LPCLSID)&guid); // Check if the GUID converted correctly if (hr == S_OK) { cout << "GUID successfully converted: " << endl; // Print english version of the SubCateogory GUID according to the API PSTR *output = new PSTR(""); bool categ_name = AuditLookupSubCategoryName(&guid, output); cout << *output << endl; } else { cout << "GUID failed conversion" << endl; } // Create an AUDIT_POLICY_INFORMATION structure describing the desired change // The AuditCategoryGuid field will be ignored according to documentation AUDIT_POLICY_INFORMATION audit; audit.AuditCategoryGuid = (GUID)guid; audit.AuditSubCategoryGuid = (GUID)guid; // Turn on auditing for success and failure audit.AuditingInformation = 0x00000003; // Create an array of AUDIT_POLICY_INFORMATION change requests AUDIT_POLICY_INFORMATION arr[1]; arr[0] = audit; bool policyChanged = TRUE; policyChanged = AuditSetSystemPolicy(arr, 1); DWORD last_error = GetLastError(); // Check if the policy change succeeded or not if (policyChanged == TRUE) { cout << "Successfully set policy" << endl; } else { cout << "Failed to set policy. Error:" << endl; cout << last_error << endl; } 

我使用Visual Studio Professional 2013运行此代码,该代码是通过select“以pipe理员身份运行”启动的。 它导致以下输出:

 GUID successfully converted: Process Creation Failed to set policy. Error: 1314 

代码1314的意思是:“ 所需的特权不由客户端持有 ” 。根据AuditSetSystemPolicy文档:“要成功调用此函数,调用方必须具有SeSecurityPrivilege或对Audit安全对象具有AUDIT_SET_SYSTEM_POLICY访问权限。 我按照TechNet上的说明进行了操作,并validation了pipe理员具有正确的审计和安全pipe理。 为了好的措施,我也给了我的用户这些权利,并重新启动计算机,以确保更改应用。 我仍然收到错误。

我也尝试使用auditpol.exe手动closures进程创build注销,运行上面的代码,然后使用auditpol.exe来validation日志logging仍然closures。 我也拉起事件查看器并手动validation没有logging正在发生。

我使用这个代码,并且必须纠正一些小问题,但总体来说,您需要在您的过程对象上设置“SeSecuritiyPrivilege”。 以管理员或系统身份运行将授予您设置此标志的权限,但您必须在设置审核级别之前将其设置在您的代码中:

 #include <atlsecurity.h> ... ATL::CAccessToken processToken; processToken.GetEffectiveToken(TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES); processToken.EnablePrivilege("SeSecuritiyPrivilege"); 

在尝试设置审计级别之前执行此操作。