我已经编写了用于更改对象(而不是进程)(在此情况下为文件)的完整性级别的代码。众所周知,我们从中等完整性级别开始,但我想将其降低到“低”级别。我想运行一个完整性较低的.txt文件,而不是默认介质。
我主要是出于这个目的使用WINAPI。因此,我创建了一个.txt文件,以将其完整性从中级降低到低级。
void SetLowLabelToFile()
{
int k = 0;
// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity
#define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
DWORD dwErr = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pSacl = NULL; // not allocated
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
LPCWSTR pwszFileName = L"C:\\Users\\Dan\\Documents\\testIntegrity\\hi1.txt";
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL))
{
k = GetLastError();
if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl,
&fSaclDefaulted))
{
k = GetLastError();
// Note that psidOwner, psidGroup, and pDacl are
// all NULL and set the new LABEL_SECURITY_INFORMATION
dwErr = SetNamedSecurityInfoW((LPWSTR)pwszFileName,
SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION,
NULL, NULL, NULL, pSacl);
k = GetLastError();
}
LocalFree(pSD);
}
}
我设置了3个GetLastErrors来获取错误代码,最后一个是1008。这意味着
An attempt was made to reference a token that does not exist
。我没有得到它,因为到文件的方式是有效的。任何人都可以帮助解决问题吗? 最佳答案
数据文件没有完整性级别。流程具有完整性级别。
您不能“运行.txt文件”,而是运行“应用程序”,然后加载.txt
文件。 “应用程序”必须以较低的完整性级别运行,而不是.txt
文件本身。
从代码启动低完整性进程的正确方法是:
让您的代码使用OpenProcessToken()
和DuplicateTokenEx()
复制其当前进程句柄。
使用SetTokenInformation()
将该访问令牌中的完整性级别设置为“低”。
使用CreateProcessAsUser()
使用该低完整性访问令牌创建新进程。
在MSDN上(在C#中)有一个示例:
Create low-integrity process in C# (CSCreateLowIntegrityProcess)