简短版本:
我正在尝试编写一个C ++程序,它可以在Windows 8上启用进程创建日志。我知道这可以使用auditpol.exe,但我想以编程方式进行。我的研究表明,唯一的方法是通过Windows API命令AuditSetSystemPolicy,所以我编写了一个调用此函数的C ++程序(见下文)。但是,该程序未能引用权限问题(错误代码1314)。我以管理员身份运行Visual Studio,我尝试在以管理员身份运行的命令提示符中执行该程序,但我仍然收到错误。
长版:
以下程序需要GUID string describing the Process Creation Subcategory我想开始审核并将其转换为GUID结构。然后,它从GUID和ULONG构造一个AUDIT_POLICY_INFORMATION结构,描述我想要进行的更改(启用成功和失败的日志记录)。最后,我将结构放入一个数组并调用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运行此代码,该代码是通过选择“以管理员身份运行”启动的。它产生以下输出:
GUID successfully converted:
Process Creation
Failed to set policy. Error:
1314
代码1314表示:“A required privilege is not held by the client.”根据AuditSetSystemPolicy文档:“要成功调用此函数,调用者必须具有SeSecurityPrivilege或对Audit安全对象具有AUDIT_SET_SYSTEM_POLICY访问权限。”我按照instructions on TechNet进行了操作,并确认管理员具有正确的管理审核和安全性。为了更好地衡量,我还给了我的用户这些权利并重新启动计算机以确保应用了更改。我仍然得到错误。
我还尝试使用auditpol.exe手动关闭Process Creation注销,运行上面的代码,然后使用auditpol.exe验证日志记录是否仍然关闭。我还提取了事件查看器并手动验证没有进行日志记录。
答案 0 :(得分:2)
我使用了这段代码并且必须纠正一些小问题,但总的来说你需要在你的过程对象上设置“SeSecuritiyPrivilege”。以管理员或系统身份运行将授予您设置此标志的权限,但您必须在尝试设置审核级别之前在代码中进行设置:
#include <atlsecurity.h>
...
ATL::CAccessToken processToken;
processToken.GetEffectiveToken(TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES);
processToken.EnablePrivilege("SeSecuritiyPrivilege");
在尝试设置审核级别之前执行此操作。