我已经编写了用于更改对象(而不是进程)(在此情况下为文件)的完整性级别的代码。众所周知,我们从中等完整性级别开始,但我想将其降低到“低”级别。我想运行一个完整性较低的.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)

10-08 19:18