Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SetNamedSecurityInfo执行重新启动系统_C++_Windows_Winapi - Fatal编程技术网

C++ SetNamedSecurityInfo执行重新启动系统

C++ SetNamedSecurityInfo执行重新启动系统,c++,windows,winapi,C++,Windows,Winapi,我正在尝试更改文件夹的审核设置。当我在不同的计算机上测试代码时,我发现SetNamedSecurityInfo调用会重新启动系统。这在某些计算机上发生。生成一个弹出窗口,显示“Windows遇到安全问题,将在一分钟内重新启动”.我想不出原因。任何帮助都将不胜感激 HANDLE hProcess = GetCurrentProcess(); HANDLE hToken; DWORD val; BOOL result; result = OpenProcessToken(hProcess, TOKE

我正在尝试更改文件夹的审核设置。当我在不同的计算机上测试代码时,我发现SetNamedSecurityInfo调用会重新启动系统。这在某些计算机上发生。生成一个弹出窗口,显示“Windows遇到安全问题,将在一分钟内重新启动”.我想不出原因。任何帮助都将不胜感激

HANDLE hProcess = GetCurrentProcess();
HANDLE hToken;
DWORD val;
BOOL result;
result = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
if (result == 0)
{
    printf("\nBreak After open process");   
    return 0;
}
else{
    printf("\ncontinue after open process");
}
// Used for reading SACL's
result = SetPrivilege(hToken, SE_SECURITY_NAME, TRUE);
if (result == 0)
{
    printf("\nBreak After setprivilege");   
    return 0;
}
else{
    printf("\ncontinue after open process");
}
CloseHandle(hToken);
retval = GetNamedSecurityInfo(file, SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, &owner, NULL, NULL, &sacl, &psd);
if(retval != 0)
{
     wcout << "GetNamedSecurityInfo failed with error: " << retval << endl;
     return -1;
}
printf("\nBuilt trust successfully before");
BuildTrusteeWithSid(ptrust,psd);
printf("\nBuilt trust successfully");


printf("\ntrying to modify ...");
EXPLICIT_ACCESS ea;
PACL pNewSACL = NULL;
ACCESS_MODE AccessMode =  SET_AUDIT_SUCCESS; //SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE
DWORD dwAccessRights = 0X410D0060;
DWORD dwInheritance = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));

ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = SET_AUDIT_SUCCESS;
ea.grfInheritance = dwInheritance;
ea.Trustee = *(ptrust); 



DWORD dwRes = SetEntriesInAcl(1, &ea, sacl, &pNewSACL);
if(dwRes != ERROR_SUCCESS)
{
    printf("SetEntriesInAcl() error %u\n", dwRes);
}
else
{
    printf("SetEntriesInAcl() is OK\n");
}

dwRes = SetNamedSecurityInfo(file, SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, NULL, NULL, NULL, pNewSACL);
if(dwRes != ERROR_SUCCESS)
{
    printf("SetNamedSecurityInfo() error %u\n", dwRes);

}
else
    printf("SetNamedSecurityInfo() is OK\n\n");


LocalFree(psd);
handlehprocess=GetCurrentProcess();
拉赫托肯;
德沃德·瓦尔;
布尔结果;
结果=OpenProcessToken(hProcess、TOKEN\u ADJUST\u PRIVILEGES和&hToken);
如果(结果==0)
{
printf(“打开过程后破裂”);
返回0;
}
否则{
printf(“\n打开进程后继续”);
}
//用于读取SACL的
结果=设置权限(hToken,SE_SECURITY_NAME,TRUE);
如果(结果==0)
{
printf(“\n设置特权后破裂”);
返回0;
}
否则{
printf(“\n打开进程后继续”);
}
闭合手柄(hToken);
retval=GetNamedSecurityInfo(文件、SE_文件、对象、SACL_安全信息和所有者、NULL、NULL、SACL和psd);
如果(返回值!=0)
{

wcout如果系统无法记录安全审核,则有一个全局策略条目控制关闭

见: “计算机配置\ Windows设置\本地策略\安全选项” “审核:如果无法记录安全审核,请立即关闭系统”

这可能与以下因素一起发生:

“计算机配置\ Windows设置\本地策略\安全选项”
“审核:审核全局系统对象的访问”

有趣!提供更多信息和代码。也许你可以不使用printf而直接写入文件并刷新。这样你就知道崩溃前的最后一个操作是什么。setnamedsecurityinfo一执行就会崩溃。你的代码运行在什么上下文中?它只是由交互用户运行的普通可执行文件,还是它有什么特别的吗?它是一个普通的可执行文件,具有为其进程指定的SE_SECURITY_名称的权限。是的,我看到了它,但在所有系统上它都被禁用。我认为这不是问题所在,因为对我来说,在为目录对象设置审核ace时,而不是在生成日志时,会重新启动。如果对象的审核访问被激活,则会自动生成日志当然,可能还涉及到其他各种政策设置。