2015-01-30 6 views
0

C++에 문제가있어 자주 사용하지 마십시오!_tprintf로 물음표가 인쇄 된 C++의 문제

디렉터리에있는 모든 허용 및 거부 사용 권한의 전체 목록을 출력하기 위해 NTFS 디렉터리에서 ACL을 처리하려고합니다.

도메인에서 ACL을 가져 왔으며 대부분의 레코드에 대해 도메인 \ 계정 이름을 사용하고 있습니다. 그러나 이것을 출력하는 것이 나에게 어떤 경우에 해당합니까? ???????? ????????.

나는 이것을위한 2 가지 이유를 확인했다.

1) SID가 고아이므로 사용자 계정이 컴퓨터에서 삭제되었습니다. GetLastError() = 1332로이를 확인할 수 있습니다.

2) '잘 알려진 SID'입니다. 즉, 매핑 할 사용자 이름이 없도록 SID로 빌드 된 것입니다. LookupAccountSid는이 시점에서 오류를보고하지 않습니다. . 필자는 모든 잘 알려진 SID를 파일로 매핑하지 않고 상호 참조 (느리게)를 수행하지 않고 이러한 사례를 식별 할 수있는 방법이 없습니다. 내가하고 싶은 것은 단순히 ???????? 대신 SID를 출력하는 것입니다. LPTSTR myTrusteeName은 ????????로 렌더링되는 LookupAccountSid()에서 반환 된 문자열입니다. 대신 SID를 인쇄하기 위해 IF 문을 쉽게 수행 할 수 있다는 것을 알고 있다면 그 실제 가치가 무엇인지 알 수 없습니다. 이제

 //this is part of a loop. 
     if (IsValidSid(mySid)){ 
      //cout << "SID supplied is valid\n"; 
      //cout << GetLengthSid(mySid) << "\n"; 

      LPWSTR mySidName = NULL; 
      ConvertSidToStringSid((PSID)mySid, &mySidName); 




      //Make an initial lookup to find out how big the names are 
      LookupAccountSid(
       NULL 
       , (PSID) mySid 
       , myTrusteeName 
       , (LPDWORD)&myDwordNameLength 
       , myDomainName 
       , (LPDWORD)&myDwordDomLength 
       , &myNameUse 
       ); //at this point error 122 is thrown as the length of myTrusteeName is too short. 

      //alter the size of these variables rather than just getting the 1st letter and some gibberish 
      myTrusteeName = (LPTSTR)GlobalAlloc(GMEM_FIXED, myDwordNameLength); 
      myDomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, myDwordDomLength); 

      //do the lookup again this time with genuine sizes 
      LookupAccountSid(
       NULL 
       , (PSID)mySid 
       , myTrusteeName 
       , (LPDWORD)&myDwordNameLength 
       , myDomainName 
       , (LPDWORD)&myDwordDomLength 
       , &myNameUse 
       ); 

      wcout << GetLastError() << "\n"; //this will output "122" even when successful because of the first attempt. 

      _tprintf(TEXT("%s\n"), myTrusteeName); //when there is no name this outputs ???????? 

      wcout << myTrusteeName << "\n"; //when there is no name this completely screws myTrusteeName so that it fails to print for the rest of the loop 


      //if we only have ???? then it's wrong 
      if (myTrusteeName == NULL){ /// WHAT IN HELL DO I PUT IN THIS COMPARISON TO IDENTIFY myTrusteeName VALUES THAT PRINT ???????? 
       wcout << "we are changing trustee because it's blank\n"; 
       myTrusteeName = _T("");//maybe change this to the value of mySidName 
       wcout << "length of trustee is now " << _tcslen(myTrusteeName) << "\n"; 
      } 
      wcout << "\n"; 



     } 

... 나는이 내가 이것을 사용 할 수 있어야 WELL_KNOWN_SID_TYPE 열거

에서 항목을 출력 IsWellKnownSid()마른 세수

라는 함수가 실현이 글을 쓰는 동안. ... 나는 ACL 편집기에서 볼 수있는 것처럼 잘 알려진 sid 유형 (즉, "사용자")의 문자열 표현을 어떻게 얻을 수 있는지 잘 모르겠다. 가장 감사하게 생각합니다.

나는이 작은 프로젝트로 아직 끝나지 않았다. 그래서 나는 어쨌든 이것을 다른 사람에게 유용하게 사용할 수 있도록 게시 할 것이라고 생각했다.

IsWellKnownSid() 함수가 없으면 인쇄하기 전에 인쇄를 거부하는 문자열 값을 어떻게 감지합니까?

독서에 대한 많은 감사와 안부 벤

+0

일반적으로 Win32 API는 예외 *를 보내지 않지만 더 멀리 가기 전에 프로그래머가 제어해야하는 오류 표시기 만 반환합니다. 현재의 경우'LookupAccountSid'가 0을 리턴하면 안된다. ** 제목은 문제와 아무 관계가 없다 :'tprintf'에서는 문제가 아니고'LookupAccountSid'에서는 문제가 아니다. –

+0

정말 감사합니다. 내 문제는 tprintf가 물음표를 인쇄하는 이유를 알지 못했기 때문에 내 문제와 매우 관련이 있습니다.) 설명 할 시간을내어 주셔서 감사합니다. – Bappy1988

답변

0

당신은 그 ConvertSidToStringSidLookupAccountSid 반환 TRUE 확인해야합니다. 그렇게하면 LookupAccountSid는 myTrusteeName에 문자열을 씁니다. LookupAccountSid가 FALSE를 반환하면 LookupAccountSid는 myTrusteeName의 내용을 변경하지 않으므로 GlobalAlloc이 반환 된 것처럼 초기화되지 않습니다.

+0

도움 주셔서 감사합니다. 입력 및 출력 변수에 대한 msdn 참조에 텍스트가 너무 많아서 bool을 반환하지 못했습니다. – Bappy1988