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() 함수가 없으면 인쇄하기 전에 인쇄를 거부하는 문자열 값을 어떻게 감지합니까?
독서에 대한 많은 감사와 안부 벤
일반적으로 Win32 API는 예외 *를 보내지 않지만 더 멀리 가기 전에 프로그래머가 제어해야하는 오류 표시기 만 반환합니다. 현재의 경우'LookupAccountSid'가 0을 리턴하면 안된다. ** 제목은 문제와 아무 관계가 없다 :'tprintf'에서는 문제가 아니고'LookupAccountSid'에서는 문제가 아니다. –
정말 감사합니다. 내 문제는 tprintf가 물음표를 인쇄하는 이유를 알지 못했기 때문에 내 문제와 매우 관련이 있습니다.) 설명 할 시간을내어 주셔서 감사합니다. – Bappy1988