cast סורר ?

antidot

New member
cast סורר ?

הקדמה: השואל הוא איש סיסטם ופעם אחרונה נגע בC/C++ לפני כשלוש שנים וגם אז רק בANSI. נתקלתי במצב בו אני נאלץ להשתמש בC++. שום VBS או Perl לא מסוגלים להתמודד בצורה נורמלית עם SecurityDescriptors... בקיצור: יש לי קטע קוד (ראו קובץ מצורף). החלק הבעייתי הוא למרבה הפלא copy&paste מMSDN. השארתי רק את קטע הקוד הרלוונטי. szTrusteeDomainName,szTrusteeName פשוט לא מודפסים אם אני משתמש בקוד מMSDN שמדפיס עם wprintf. printf מצד שני עובד נהדר. ישבתי על זה בערך שעה עם דבגר. אני רואה את הערכים הנכונים במשתנים אם אני מוסיף אותם לwatch עם cast ל char*, אבל להופיע במסך ? נאדה... ניסיתי explicit casting לLPTSTR, עם תוצאה זהה עד שנמאס לי והשתמשתי בprintf הטוב והמוכר לי וראו איזה פלא... הדברים התחילו לעבוד. אם מישהו ישווה עם הקוד בדוגמא, הוא יכול לשים לב בפונקציה LookupAccountSid עשיתי casting לפרמטר שלישי וחמישי ל LPTSTR (וזה בגלל שהVS.NET המניאק לא הסכים לקמפל בלי זה (מעניין איך אצל מייקרוסופט זה התקמפל ?). מישהו יכול אולי להסביר (עם הנחה לחלודה בכל הקשור לC++), מה הבעיה כאן ? האם יש סיכוי שאני עושה משהו לא נכון ? מדובר באפליקציה קטנה שאמורה לעשות parsing ל SDDL והשגיאות כלל לא מבורכות כיוון שמדובר על ACL של Schema של Active Directory (מי שלא מכיר, מדובר באוסף buzz words של אנשי סיסטם).
 

דריזט

New member
נראה לי שהבעיה היא רק בהגדרות סביבה

אתה פשוט צריך לעבוד בסביבת UNICODE. במאפייני הפרוייקט, במסך הראשון שנה את Character Set ל UNICODE ובנה מחדש.
 

antidot

New member
אין מצב

במקום אחר אותה פונקציה עובדת נהדר. הפרוייקט כבר מוגדר כunicode מה שלא מודפס זה רק הערך של המשתנים. זה מה שאני מקבל: Trustee: במקום Trustee: Domain\User
 

annefan

New member
בטוח שכבר בדקת

אבל את מכיר את Active Directory Cookbook של O'Reilly? אין שם שום דבר שמתאים לך? כאן יש את כל הקוד, גם ב-VBS וגם ב-PERL. אולי תוכל להפיק מזה משהו?
 

antidot

New member
---->

1) מכיר (לא עוזב את שולחן העבודה שלי) 2) מעדיף את Inside Active Directory למרות שיש בו פחות קוד (חבל שיש לי את המהדורה הראשונה - שניה יצאה אחרי שקניתי) 3) ברשימת התפוצה של activedir.org שבה משתתף לא מעט רובי אלן (כותב הAD Cookbook) דובר על זה בעבר והמסקנה היא C/C++. 4) SDDL sucks big time 5) כמובן שאפשר להשתמש גם בPerl וגם בVB, אבל בשביל זה צריך לעשות סאלטות על מנת לקבל גישה לAPI שבC++ זמין native
 

annefan

New member
עוד נסיון

הפרמטרים השלישי והחמישי מוגדרים כ-LPTSTR, כלומר תלויים האם UNICODE מוגדר או לא. זה ש-VS.NET מכריח אותך לעשות casting, רומז שהוא חושב שהפונקציה אמורה לקבל LPSTR -> אולי בגלל ש-UNICODE לא מוגדר. אבל אתה אומר שבדקת, אז אולי תדחס את הפרויקט (בלי ה-NCB והאובייקטים) ותעלה לפה. אין לי AD לבדוק מולו, אבל להסתכל על הפרויקט נוכל.
 

דריזט

New member
אני נאלץ להתעקש ../images/Emo123.gif

להלן העובדות: 1. wprintf לא מדפיס מחרוזות שאינן UNICODE 2. המאקרו OLECHAR הוא תמיד WCHAR 3. המאקרו LPTSTR לעומת זאת תלוי בהגדרות - LPWSTR או LPSTR נסה לקרוא ל LookupAccountSidW בלי ה cast - צריך לעבוד. ואם אני טועה... אתה יכול לתת לי
 

antidot

New member
הםםם...

זה לא שאני בן אדם אלים, אבל בלי cast, אני מקבל צעקות מVS על זה שלא ניתן לעשות cast מOLECHAR לLPTSTR. בפונקציה LookupAccountSid (פרמטר שלישי וחמישי - שעבורם עשיתי cast ) LPTSTR הוא מאקרו לTCHAR* (ואת זה טוען VS). מצד שני אני אידיוט וכרגע הורדתי לעצמי כאפה: אני מקפל release (שלא מוגדר unicode) כאשר את השינוי לunicode עשיתי בdebug. ועוד אומרים שVS כזה חכם... שיניתי במקום אחד, היה קשה לעדכן במקום אחר ??? בקיצר: התעלומה הוגדרה ז"ל. רב תודות
 

antidot

New member
ואם אני כבר כאן, אז עוד שאלה מפגרת

איך אני מוסיף אייקון לexe שנוצר ? אני רוצה שיהיה יפה ומכובד ולא כמו שאר אפליקציות CLI ללא זהות עצמית.
 

דריזט

New member
ב resource view

תוסיף resource מסוג icon ותבנה מחדש. חלונות כבר תראה אותו כסמל התוכנית.
 

דריזט

New member
לא יודע מה זה SDDL

אבל עם מסרים כאלה חתרניים אל תתפלא אם יקרוס לך המחשב
 

antidot

New member
היית מת !

מה זה SDDL ? זה משהו כזה: D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPLOCRRC;;;PU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY) לדבר הזה אני עושה parsing שיראה משהו כזה:
**** ACE 3 of 4 **** ACE Type: ACCESS_ALLOWED_ACE_TYPE Trustee: BUILTIN\Administrators AccessMask: ADS_RIGHT_DELETE ADS_RIGHT_READ_CONTROL ADS_RIGHT_WRITE_DAC ADS_RIGHT_WRITE_OWNER ADS_RIGHT_DS_CREATE_CHILD ADS_RIGHT_DS_DELETE_CHILD ADS_RIGHT_ACTRL_DS_LIST ADS_RIGHT_DS_SELF ADS_RIGHT_DS_READ_PROP ADS_RIGHT_DS_WRITE_PROP ADS_RIGHT_DS_DELETE_TREE ADS_RIGHT_DS_LIST_OBJECT ADS_RIGHT_DS_CONTROL_ACCESS Inheritance flags: 0 **** ACE 4 of 4 **** ACE Type: ACCESS_ALLOWED_ACE_TYPE Trustee: NT AUTHORITY\SYSTEM AccessMask: ADS_RIGHT_READ_CONTROL ADS_RIGHT_DS_CREATE_CHILD ADS_RIGHT_ACTRL_DS_LIST ADS_RIGHT_DS_SELF ADS_RIGHT_DS_READ_PROP ADS_RIGHT_DS_WRITE_PROP ADS_RIGHT_DS_DELETE_TREE ADS_RIGHT_DS_LIST_OBJECT ADS_RIGHT_DS_CONTROL_ACCESS Inheritance flags: 0​
אגב, זה מה שפינגווין אמר... אני לא אשם. נכון שהרבה יותר קריא ?
 

codec

New member
כמעט UNICODE

התרגום של OLECHAR לא "נשלט" ע"י ההגדרה הרגילה של UNICODE, אלא ע"י הגדרה אחרת: OLE2ANSI. תנסה. אבל למה אתה בכלל משתמש ב-OLECHAR? מה רע ב-TCHAR? נראה לי מספיק טוב. בנוסף, שלחתי מסר. בהצלחה.
 

antidot

New member
עם האוכל בא התאבון - עוד שאלונת

יש לי את ההרגל המגונה להפוך הכל לסקריפטים וכידוע סקריפטים אוהבים pipes. נכון לעכשיו הלוגיקה הולכת ככה:
if (argv[1]) { if ( wcscmp((argv[1]),L"/?")==0) usage(argv[0]); else { hr = ParseSDDL(argv[1]); } } else { while(wcin.getline(szLine,MAX_PATH)) { hr = ParseSDDL((TCHAR*)szLine); } }​
במצב הנתון, אם אני לא מעביר נתונים דרך pipe ולא מספק ארגומנטים, האפליקציה ממתינה לקלט. נשאלת השאלה: איך אני גורם לאפליקציה במצב שאין פלט, להציג usage ועדיין להיות מסוגלת לקבל נתונים דרך pipe ?
 

selalerer

New member
peek יכול לעזור לך.

נתחיל בזה שאני שצריך להשתמש בargc בכדי לבחון אם יש ארגומנט ולא בargv כי יכול להיות בו זבל שבמצבים מסויימים לא יכיל אפסים (NULLים לצורך העניין) ואז הבדיקה תיכשל. מלבד זאת אתה יכול להשתמש ב peek בשביל לבחון האם יש משהו בקלט, אם לא הוא מחזיר לך EOF ואם זה מה שאתה מקבל על ההתחלה אז הקלט ריק ואתה יכול להציג את usage.
 
למעלה