2013-07-04 20 views
2

백업 및 복구 도구를 작성하려고합니다. WinPE CD (http://en.wikipedia.org/wiki/Windows_Preinstallation_Environment)에서 코드를 실행하고 있습니다. 전체 C : 파티션을 읽고 네트워크에 쓰려고합니다. tar 명령과 같지만 특정 창은 다릅니다. 파일 소유자를 설정하는 것 외에는 모든 것이 작동합니다. Windows는 알려지지 않은 SID가 소유 한 파일에 대해 정말로 용납하지 않는 것 같습니다. WinPE에서 실행 중이므로 C :에 정의 된 대부분의 사용자는 로컬 사용자 데이터베이스에 없습니다.파일 소유자를 Windows에 존재하지 않는 사용자/SID로 설정하십시오.

  • SetFileSecurity (반환 1307)
  • SetSecurityInfo (반환 1307)
  • SetNamedSecurityInfo가 (반환 1307)
  • BackupWrite (반환 1307) : 여기

    내가 해봤 기능 중 일부입니다
  • NtSetSecurityObject (0xC000005A 반환)

나는 이것이 행해질다는 것을 알고있다. SetACL (http://helgeklein.com/setacl/) 할 수 있습니다.

그래서, 질문입니다. 파일의 소유자를 존재하지 않는 사용자/SID로 설정하려면 어떻게해야합니까? 어떤 도움이라도 대단히 감사합니다!

#define _WIN32_WINNT 0x0500 

#include <windows.h> 
#include <sddl.h> 
#include <aclapi.h> 
#include <tchar.h> 

INT _tmain(){ 

    PSECURITY_DESCRIPTOR psdOwner = LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH); 

    if (InitializeSecurityDescriptor(psdOwner,SECURITY_DESCRIPTOR_REVISION)){ 

     PSID psOwner = (PSID)0; 

     if (ConvertStringSidToSid(TEXT("S-1-5-21-3626571138-2175758104-1447827851-1013"),&psOwner)){ 

      if (SetSecurityDescriptorOwner(psdOwner,psOwner,FALSE)){ 

       DWORD dwError = SetNamedSecurityInfo(TEXT("test.txt"),SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,psdOwner,NULL,NULL,NULL); 

       if (dwError == ERROR_SUCCESS){ 

        _tprintf(TEXT("Success!\n")); 

       }else{ 

        _tprintf(TEXT("Failed to set owner: %u\n"),dwError); 

       } 

      }else{ 

       _tprintf(TEXT("Failed to set owner into SD: %u\n"),GetLastError()); 

      } 

     }else{ 

      _tprintf(TEXT("Failed to covnert Sid string to Sid: %u\n"),GetLastError()); 

     } 

     if (psOwner) LocalFree(psOwner); 

    }else{ 

     _tprintf(TEXT("Failed to initialize SD: %u\n"),GetLastError()); 

    } 

    if (psdOwner) LocalFree(psdOwner); 

    return 0; 

} 

답변

2

당신이 토큰 권한을 SE_RESTORE_NAME 필요가 밝혀 :

는 여기에 내가 해봤 코드의 샘플입니다. 당신은 다음과 프로세스 토큰을 조정할 수 있습니다

BOOL TakeSecurityPriv(LPCTSTR szPriv){ 

    BOOL bReturn = FALSE; 

    HANDLE hProcToken = (HANDLE)0; 

    if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hProcToken)){ 

     TOKEN_PRIVILEGES tpTokPriv; 

     if (LookupPrivilegeValue(NULL,szPriv,&tpTokPriv.Privileges[0].Luid)){ 

      tpTokPriv.PrivilegeCount = 1; 
      tpTokPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

      if (AdjustTokenPrivileges(hProcToken,FALSE,&tpTokPriv,0,NULL,0)){ 

       bReturn = TRUE; 

      } 

     } 

    } 

    return bReturn; 

} 

이 그럼 당신은 내 예를 메인의 시작 부분에 다음을 추가 할 수 있습니다

if (TakeSecurityPriv(SE_RESTORE_NAME)){ 

1307 오류를 제거한다 그. 불행히도 소유자가 올바른 SID로 설정되지 않았으므로 예제에 다른 버그가 있습니다. 그러나 다시 BackupRead/BackupWrite로 전환하면 SID 또는 SECURITY_DESCRIPTOR을 만들지 않아도됩니다. 나는 운이없는 잠시 동안 문제가 될 수있는 것을 생각해 보았습니다. 아마도 다른 누군가가 그 부분에 대답 할 수 있습니다.