File can';无法获取文件的sacl
我想知道文件的完整性级别,但无法获取sacl。GetNamedSecurityInfo返回0(错误\成功),这意味着 执行时没有错误,但SACL仍然变为0x00000000。有人知道问题出在哪里吗File can';无法获取文件的sacl,file,security,winapi,acl,File,Security,Winapi,Acl,我想知道文件的完整性级别,但无法获取sacl。GetNamedSecurityInfo返回0(错误\成功),这意味着 执行时没有错误,但SACL仍然变为0x00000000。有人知道问题出在哪里吗 int GetFileIntegrityLevel() { DWORD integrityLevel = SECURITY_MANDATORY_UNTRUSTED_RID; PSECURITY_DESCRIPTOR pSD = NULL; PACL acl = 0; i
int GetFileIntegrityLevel()
{
DWORD integrityLevel = SECURITY_MANDATORY_UNTRUSTED_RID;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL acl = 0;
int dw = 0;
GetNamedSecurityInfoA("C:\\8.docx", SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, 0, 0, 0, &acl, &pSD));
{
if (0 != acl && 0 < acl->AceCount)
{
SYSTEM_MANDATORY_LABEL_ACE* ace = 0;
if (GetAce(acl, 0, reinterpret_cast<void**>(&ace)))
{
SID* sid = reinterpret_cast<SID*>(&ace->SidStart);
integrityLevel = sid->SubAuthority[0];
}
}
PWSTR stringSD;
ULONG stringSDLen = 0;
ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, ACCESS_SYSTEM_SECURITY, &stringSD, &stringSDLen);
if (pSD)
{
LocalFree(pSD);
}
}
if (integrityLevel == 0x0000)
return 0;
else if (integrityLevel == 0x1000)
return 1;
else if (integrityLevel == 0x2000)
return 2;
else if (integrityLevel == 0x3000)
return 3;
else if (integrityLevel == 0x4000)
return 4;
else
return -1;
}
int main()
{
HANDLE curProcess = GetCurrentProcess();
TOKEN_PRIVILEGES tp;
LUID sdv;
HANDLE hToken = 0;
OpenProcessToken(curProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_READ | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &sdv);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = sdv;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), (PTOKEN_PRIVILEGES)NULL, 0);
int i = GetFileIntegrityLevel();
printf("%d\n", i);
printf("%d\n", i);
CloseHandle(curProcess);
std::cin.get();
}
int-GetFileIntegrityLevel()
{
DWORD integrityLevel=安全性\强制性\不受信任\ RID;
PSECURITY_描述符pSD=NULL;
PACL-acl=0;
int-dw=0;
GetNamedSecurityInfoA(“C:\\8.docx”,SE_文件对象,SACL_安全信息,0,0,&acl,&pSD));
{
如果(0!=acl&&0AceCount)
{
系统\强制性\标签\ ACE*ACE=0;
if(获取ace(acl,0,重新解释强制转换(&ace)))
{
SID*SID=reinterpret_cast(&ace->SidStart);
integrityLevel=sid->子权限[0];
}
}
PWSTR-stringSD;
ULONG stringSDLen=0;
ConvertSecurityDescriptor StringSecurityDescriptor(pSD、SDDL修订版1、访问系统安全、stringSD和stringSDLen);
中频(pSD)
{
本地自由(pSD);
}
}
if(integrityLevel==0x0000)
返回0;
else if(integrityLevel==0x1000)
返回1;
else if(integrityLevel==0x2000)
返回2;
else if(integrityLevel==0x3000)
返回3;
else if(integrityLevel==0x4000)
返回4;
其他的
返回-1;
}
int main()
{
HANDLE curProcess=GetCurrentProcess();
令牌特权;
路易德斯德夫;
句柄hToken=0;
OpenProcessToken(curProcess、TOKEN_ADJUST_PRIVILEGES、TOKEN|READ、TOKEN|QUERY和hToken);
LookupPrivilegeValue(NULL、SE_SECURITY_NAME和sdv);
tp.privilegecont=1;
tp.Privileges[0]。Luid=sdv;
tp.Privileges[0]。Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),(PTOKEN\u PRIVILEGES)NULL,0);
int i=GetFileIntegrityLevel();
printf(“%d\n”,i);
printf(“%d\n”,i);
闭合手柄(curProcess);
std::cin.get();
}
您不需要使用,但是
示例代码:
ULONG GetFileIntegrityLevel(PCWSTR fileName, PULONG pil)
{
PACL Sacl;
PSECURITY_DESCRIPTOR pSD;
*pil = SECURITY_MANDATORY_MEDIUM_RID;// default LABEL
ULONG err = GetNamedSecurityInfoW(fileName, SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, 0, 0, 0, &Sacl, &pSD);
if (!err)
{
if (Sacl)
{
union {
PVOID Ace;
PSYSTEM_MANDATORY_LABEL_ACE pLabel;
PACE_HEADER pHeader;
};
err = ERROR_GEN_FAILURE;
ACL_SIZE_INFORMATION asi;
if (GetAclInformation(Sacl, &asi, sizeof(asi), AclSizeInformation))
{
PSID Sid;
union {
PUCHAR pc;
PULONG pl;
};
static SID_IDENTIFIER_AUTHORITY LabelAuth = SECURITY_MANDATORY_LABEL_AUTHORITY;
switch (asi.AceCount)
{
case 1:
if (GetAce(Sacl, 0, &Ace))
{
if (pHeader->AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE)
{
Sid = &pLabel->SidStart;
if (pc = GetSidSubAuthorityCount(Sid))
{
if (*pc == 1 && !memcmp(&LabelAuth, GetSidIdentifierAuthority(Sid), sizeof(SID_IDENTIFIER_AUTHORITY)))
{
if (pl = GetSidSubAuthority(Sid, 0))
{
*pil = *pl;
case 0:
err = ERROR_SUCCESS;
}
}
}
}
}
break;
}
}
}
LocalFree(pSD);
}
return err;
}
尽管
SYSTEM\u emmandable\u LABEL\u ACE\u TYPE
位于SACL-SACL\u SECURITY\u INFORMATION
中,但不会返回此ACE
——它会过滤SACL并从输出中删除此ACE类型。仅LABEL\u SECURITY\u INFORMATION
返回此ACE类型-SACL还将筛选并删除除此类型之外的所有ACE。如果我们希望未按原样筛选SACL-需要使用两个标志-标记安全信息| SACL安全信息
在大多数情况下,文件/文件夹根本没有强制标签。在这种情况下,默认情况下-SECURITY\u MANDATORY\u MEDIUM\u RID
假定。因此,下一步是算法-我们使用标签安全信息查询标签
- 若文件根本并没有SACL—我们在输出中得到空SACL—那个么
默认
SECURITY\u MANDATORY\u MEDIUM\u RID
- 如果文件有SACL但没有标签-我们在输出中得到空SACL
-再次 默认情况下,(Sacl!=NULL&&acecont==0)
SECURITY\u employment\u MEDIUM\u RID
- 如果文件具有强制标签-我们必须使用
- 需要从这个ACE中提取RID吗acecont==1
代码中几乎没有错误处理。几乎任何呼叫都可能失败,但我们不知道是不是这样。请执行错误报告。除了使代码更简单之外,
LABEL\u SECURITY\u INFORMATION
是否还有其他好处?例如,这是否意味着你不需要提升特权?@HarryJohnston-信息真的不多。几乎大多数文件都没有明确的标签-因此默认情况下-MEDIUM
。一些文件,例如在Users\\AppData\LocalLow
中具有LOW
-对于低完整性,应用程序可以写入此位置HIGH
我只在系统驱动器的根目录中查看(例如c:\\
),而另一个系统文件夹(如c:\windows
-没有标签-因此MEDIUM
)也没有标签。这对于一些实用程序来说是非常有用的。当然,这里没有提到文件DACL,只读,etc@HarryJohnston-“这是否意味着您不需要提升权限”-是的,当我们使用它时,我们不需要SE\u SECURITY\u NAME
权限,这与使用SACL\u SECURITY\u信息时不同。但main-即使对象在SACL-SACL\u SECURITY\u信息中有标签
-也不会返回它。仅标签\u安全信息
-返回标签。所以没有别的办法了。真奇怪。我猜它是这样工作的compatibility@HarryJohnston-不,我检查了SACL_安全信息,但没有返回标签ace。尽管它在SACL上。只有标签安全信息才能返回它。