C를 사용하면 프로세스와 하위 프로세스 사이에 파이프 연결을 설정하려고 시도하는 반면 하위 프로세스에는 하위 (필수) 수준 (낮음, 상위 프로세스가 높음)이 있습니다. SetSecurityInfo에서 액세스가 거부됨을 반환합니다.
나는 다음과 같은 프로그램을 작성 (이것은 단순화 된 버전이있는 경우입니다)하지만, 실패 :BOOL SetSeSecurityNamePrivilege()
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_IMPERSONATE, &hToken)
return FALSE
if (!LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &luid))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
return FALSE;
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
return FALSE;
return TRUE;
}
참고 : ERROR_ACCESS_DENIED (0x5)
INT wmain(IN SIZE_T nArgc, IN PWSTR *pArgv)
{
SECURITY_ATTRIBUTES securityArrtibutes = { 0 };
HANDLE hPipeRead = NULL;
HANDLE hPipeWrite = NULL;
tSecurityArrtibutes.nLength = sizeof(tSecurityArrtibutes);
tSecurityArrtibutes.bInheritHandle = TRUE;
SetSeSecurityNamePrivilege();
CreatePipe(&hPipeRead, &hPipeWrite, &securityArrtibutes, 0);
ChangeMandatoryLabelHandle(hPipeRead);
}
VOID ChangeMandatoryLabelHandle(HANDLE hObject)
{
BOOL bRetval = FALSE;
DWORD dwError = 0;
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
PACL ptSacl = NULL;
BOOL bSaclPresent = FALSE;
BOOL bSaclDefaulted = FALSE;
PWSTR pSDDL = NULL;
SDDL = L"S:(ML;;LW;;;NW)";
bRetval = ConvertStringSecurityDescriptorToSecurityDescriptorW(pSDDL, SDDL_REVISION_1, &pSecurityDescriptor, NULL);
if (FALSE == bRetval)
... // Handle failure
bRetval = GetSecurityDescriptorSacl(pSecurityDescriptor, &bSaclPresent, &ptSacl, &bSaclDefaulted);
if (FALSE == bRetval)
... // Handle failure
// getting ERROR_ACCESS_DENIED (0x5)
dwErr = SetSecurityInfo(hObject, SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, ptSacl);
if (ERROR_SUCCESS != dwErr)
... // Handle failure
... // Cleanup
}
내가 https://msdn.microsoft.com/en-us/library/windows/desktop/aa379588(v=vs.85).aspx과 말을 따라 To set the SACL of an object, the caller must have the SE_SECURITY_NAME privilege enabled.
한다 : CreatePipe
대신 CreateFile
을 사용하여 파일을 실행하려고하면 동일한 결과가 발생합니다. 또한 파일로 처리하려고하면 SetSecurityInfo
을 SetNamedSecurityInfoW
으로 바꾸고 파일의 전체 경로를 지정하면 잘 작동합니다.
누구나 어떻게 작동하는지 아이디어가 있습니까? 감사!
RbMm이 답변에서 설명하는 것처럼 보안 설명자를 변경하면 실제로 여기에서 해결하려고하는 모든 문제에 어떤 영향도 미치지 않습니다. 일단 자신이 그것을 확신하게되면 실제 문제에 초점을 맞춘 또 다른 질문을 게시하는 것이 좋습니다. –