我在 VC++ 中有应用程序。它在应用程序会话结束后启动和修改日志文件时创建 test.log 文件。
我的问题是让两个普通的 Windows 用户 test1 和 test2 都没有管理员权限。
1]当我使用test1用户登录windows并启动我的应用程序时。如果用户不进行任何操作,应用程序会话将在 10 分钟后结束。当应用程序结束时,我在“C:\ProgramData\MyApplication\datalog.log”位置创建 datalog.log 文件。
2]我注销Windows test1用户
3]我在同一个窗口上登录 test2 用户并运行我的应用程序,这次当会话结束时,我的应用程序崩溃并显示如下错误消息:
问题签名:问题事件名称:BEX 应用程序名称:MyApplication.exe 应用程序版本:1.0.0.0 应用程序时间戳:5d60cf28 故障模块名称:ucrtbase.DLL 故障模块版本:10.0.10240.16390 故障模块时间戳:55a5bf73
异常偏移量:0007c3b4 异常代码: c0000417 异常数据:00000000 操作系统版本:6.1.7601.2.1.0.256.48
为了解决这个问题,我实现了以下功能
void SetFilePermission(LPCTSTR FileName)
{
PSID pEveryoneSID = NULL;
PACL pACL = NULL;
EXPLICIT_ACCESS ea[1];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
// Create a well-known SID for the Everyone group.
AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID);
// Initialize an EXPLICIT_ACCESS structure for an ACE.
ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = 0xFFFFFFFF;
ea[0].grfAccessMode = GRANT_ACCESS;
ea[0].grfInheritance = NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID;
// Create a new ACL that contains the new ACEs.
SetEntriesInAcl(1, ea, NULL, &pACL);
// Initialize a security descriptor.
PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
// Add the ACL to the security descriptor.
SetSecurityDescriptorDacl(pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE); // not a default DACL
//Change the security attributes
SetFileSecurity(FileName, DACL_SECURITY_INFORMATION, pSD);
if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);
}
从以下调用
SetFilePermission(FileName);
stream = fopen( FileName, "a" );
//LOG
//fprintf( stream, "%s\n", s );
fprintf( stream, "%s %s\n", buff, s );
//LOG
fclose( stream );
fprintf( stream, "%s %s\n", buff, s );
在调试时,我的应用程序在此行没有任何消息而崩溃。
当我尝试手动修改文件时,它会给出访问权限权限消息。
我需要为 datalog.log 文件提供读/写访问权限,而不管用户在 Windows 上登录和创建文件的用户如何。
操作系统是windows 7