گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
آها ممنون
پس فقط با توابع Marshal باید کار کنم . چون فکر کردم مثل مثالی که در دو صفحه ی قبل زدید ، اونجوری باید عمل کنم و پروتایپ اش هم لازمه .
یه سئوال اینکه در توابعی که در See Also در راهنمای استراکچر SECURITY_DESCRIPTOR اومد :

_SECURITY_DESCRIPTOR

(بعد از مقداردهی اولیه و استفاده از تابع InitializeSecurityDescriptor) ، برای مقداردهی فیلدهای استراکچر ، باید فقط از توابعی که با Set شروع میشن استفاده کنم دیگه؟ یعنی لازم نیست با توابعی که با Get شروع میشن کار کنم دیگه؟ چون خروجی توابع Get شون همه bool هستن .

بله دیگه، get ها مقدار برمیگردونن و set ها مقداردهی می کنند.

بعد اگه پارامترهای این توابعی که با Set شروع میشن ، اشاره گر به یه استراکچر دیگه خواستن (مثل تابع SetSecurityDescriptorDacl که پارامترسومش اشاره گر به استراکچر ACL میخواد) ، اون استراکچر را هم توی See Also اش ببینم اگه توابعی داشت که این استراکچر را مقداردهی اولیه کنه و اطلاعات فیلدهاش را پر کنه (مثل متد InitializeAcl و متد SetAclInformation برای استراکچر ACL) ، از توابع Marshal استفاده کنم و با AllocHGlobal براش حافظه بگیرم و بقیه ی کارهایی که گفتین را انجام بدم وگرنه اگه این توابع نبود ، خودم مثل نمونه های قبلی (که در دو صفحه ی پیش یا در مثال اتوپلی که اون موقع گفته بودین) ، پروتوتایپ اش را تعریف کنم و مقداردهی اش کنم؟ درست میگم؟
بله، هر کدوم که اشاره ای به متغیر بودن فرمت نکرده یا پر کردن دستی شون رو منع نکرده طبعا برایشان تعریف struct می کنید.
 

the_king

مدیرکل انجمن
فقط دقت کنید که بعضی مواردی که میسازید توسط یک آدرس حافظه یا Handle مدیریت میشن که باید حفظ بشه، بعدا Release یا Free بشه. برای اونجور موارد که در توضیحاتش هم اشاره میکنه اگه آدرس اشاره گر هست باید از حافظه Unmanaged استفاده کنید و به همین جهت حتی اگر struct ای در کار باشه به اون Marshal نیاز دارید.
 

SU-57

Active Member
سلام

1- آرگومان و پارامتر چه تفاوت هایی دارن چون در بعضی جاها به جای هم به کار میرن.

2- کامپوننت چیه؟ مثلا نوشته شده که منوها و کنترل ها کامپوننت هستن اما تا جایی که می دونم کنترل ها کلاس هستن.

نوشته متد show یک متد static هستش چون با نام کلاسش فراخوانی می شه. این static به چه معناست و آیا تفاوتش با متد غیر static فقط همینه. مثلا آیا متد writeline هم static هستش چون اون هم با console میاد. آیا متدی در سی شارپ داریم که مثل show باشه اما static نباشه.

3- این جمله ها نوشته شده:

"کلاس های درون فایل کامپایل میشن و پسوند exe یا dll می گیرن که به این ها اسمبلی می گویند. که این اسمبلی ها شامل کدهای MSIL هستن"

" کلاس MessageBox در فضای کاری System.Windows.Forms قرار داره و کلاس console در فضای کاری system.

"کلاس MessageBox در فایل اسمبلی System.Windows.Forms.dll قرار داره و کلاس console در فایل اسمبلی mscorlib.dll"

سوالات:

1- کلاس های درون کدوم فایل ها کامپایل میشن و پسوند exe یا dll می گیرن. کلاس هایی که از قبل در سی شارپ وجود داره یا کلاس هایی که ما می نویسیم.

2- به طور کلی کدوم فایل ها exe میشن و کدوم فایل ها dll. و اینکه dll چه نوع فایلی هست.

3- طبق چیزی که من خوندم کدهای سی شارپ اول به MSIL تبدیل میشن و بعد به زبان ماشین. پس چرا هنوز توی اون فایل های اسمبلی کدهای MSIL وجود داره.

4- اینکه ما بدونیم کلاس console در فلان فایل اسمبلی وجود داره تاثیری داره و باید همه کلاس ها رو حفظ کنیم که در کدام فایل اسمبلی هستن.

5- نوشته همه کلاس ها به ارجاع نیاز دارن اما کلاس console به ارجاع نیاز نداره. این ارجاع ها در کجا ثبت میشن و ما از کجا می تونیم بفهمیم که فلان کلاس ارجاع شده و اون یکی ارجاع نشده. و این ارجاع کاربردش چیه و چطوری باید یک کلاس رو ارجاع بدیم و به چه چیزی ارجاع بدیم.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام

1- آرگومان و پارامتر چه تفاوت هایی دارن چون در بعضی جاها به جای هم به کار میرن.

2- کامپوننت چیه؟ مثلا نوشته شده که منوها و کنترل ها کامپوننت هستن اما تا جایی که می دونم کنترل ها کلاس هستن.

نوشته متد show یک متد static هستش چون با نام کلاسش فراخوانی می شه. این static به چه معناست و آیا تفاوتش با متد غیر static فقط همینه. مثلا آیا متد writeline هم static هستش چون اون هم با console میاد. آیا متدی در سی شارپ داریم که مثل show باشه اما static نباشه.

سلام آقا رامین
چیزهایی که تسلط بیشتری بهش دارم را جواب میدم . بقیه را به همراه تصحیح عرایضم (اگه نکته ای را اشکال داشتم) ، استاد علی معمولا زحمت شو میکشه که دستش درد نکنه :rose:
1) اگه اشتباه نکنم ، آرگومان ، به ورودی های یه تابع موقع فراخونی میخوان بدهند را میگن اما پارامتر ورودی های تابع وقتی میخوان تعریف کنن را میگن . حالا چرا دو اسم متفاوت گذاشتن را نمیدونم .
2) کمپوننت چندین نوع داریم . کامپوننت های com (که جزء api ویندوز هه و با زبان c یا ++c نوشته میشه) اما کمپوننت هایی که تو مد نظرت هه ، کمپوننت های سی شارپ هه که با زبان سی شارپ هم نوشته میشه هست . این کمپوننت های سی شارپ ، به هر چیزی یا کلاسی که از اینترفیس IComponent ارث بری کنه را میگن (مثل تمام کنترل هایی که در دات نت میبینی مثل دکمه و منو و لیبل و ... و حتی کلاس های دیگه که ازش ارث بری میکنن) :

IComponent Interface (System.ComponentModel)

C# - What is a component and how is it typically used?

- اعضا (مثل متد و پروپرتی و ...) ، میتونن static یا شی گرا (غیر static) باشن .
اگه static باشن ، مستقیما نام کلاس را میبرن تا به اعضا شون دسترسی پیدا کنن مثلا بعد از بردن نام کلاس MessageBox ، نام عضو (متد) اش که Show هست را میبرن یعنی MessageBox.Show .
اما اگه شی گرا باشن ، حتما باید اول از کلاسش شی ساخت (اگه میخوایم شی جدیدی بسازیم که با کلمه ی کلیدی new این کار را میکنیم) تا به اعضاش دسترسی پیدا کنیم مثل :


کد:
StringBuilder strBuilder = new StringBuilder("abc");

که بعد با متغییر strBuilder ، به اعضای شی گرای کلاس StringBuilder (نه به اعضای static این کلاس) دسترسی داریم .
تفاوت خاصی ندارن جز اینکه برای فراخونی اعضای استاتیک ، حتما نباید شی ساخت و برای فراخونی اعضای شی گرا ، حتما باید شی ساخت . بله متد writeline هم static هست . درباره ی متد show بدون استاتیک ، خبر ندارم .
قضیه ی استاتیک در قسمت 41 گفته شد.



3- این جمله ها نوشته شده:

"کلاس های درون فایل کامپایل میشن و پسوند exe یا dll می گیرن که به این ها اسمبلی می گویند. که این اسمبلی ها شامل کدهای MSIL هستن"

" کلاس MessageBox در فضای کاری System.Windows.Forms قرار داره و کلاس console در فضای کاری system.

"کلاس MessageBox در فایل اسمبلی System.Windows.Forms.dll قرار داره و کلاس console در فایل اسمبلی mscorlib.dll"

سوالات:

1- کلاس های درون کدوم فایل ها کامپایل میشن و پسوند exe یا dll می گیرن. کلاس هایی که از قبل در سی شارپ وجود داره یا کلاس هایی که ما می نویسیم.

2- به طور کلی کدوم فایل ها exe میشن و کدوم فایل ها dll. و اینکه dll چه نوع فایلی هست.

3- طبق چیزی که من خوندم کدهای سی شارپ اول به MSIL تبدیل میشن و بعد به زبان ماشین. پس چرا هنوز توی اون فایل های اسمبلی کدهای MSIL وجود داره.

4- اینکه ما بدونیم کلاس console در فلان فایل اسمبلی وجود داره تاثیری داره و باید همه کلاس ها رو حفظ کنیم که در کدام فایل اسمبلی هستن.

5- نوشته همه کلاس ها به ارجاع نیاز دارن اما کلاس console به ارجاع نیاز نداره. این ارجاع ها در کجا ثبت میشن و ما از کجا می تونیم بفهمیم که فلان کلاس ارجاع شده و اون یکی ارجاع نشده. و این ارجاع کاربردش چیه و چطوری باید یک کلاس رو ارجاع بدیم و به چه چیزی ارجاع بدیم.

3) :

1) مسلط نیستم اما همه ی کلاس ها کمپایل میشن
2) روند بخش اول سئوالت را دقیق نمیدونم .
اما dll فایلی هست که توش کلاس و اعضاش را درست میکنن (مثل همین فایل ها با پسوند cs در سی شارپ) و به برنامه نویس های دیگه میدن تا اونا ازش استفاده کنن . معمولا فایل های dll خود api ویندوز یا (wrapper ها برای سی شارپ کارها) خیلی مورد استفاده قرار میگیره .
4) نه حفظ لازم نیست . از راهنمای msdn مییشه متوجه شد که کدوم کلاس یا عضو ، داخل کدوم فایل dll و ... وجود داره .
5) منظور از ارجاع ، ساخت شی هست (کلمه ی کلیدی new و ... که گفتم) . کلاس console ارجاع یا شی نمیخواد چون static هه .
 

the_king

مدیرکل انجمن
سلام

1- آرگومان و پارامتر چه تفاوت هایی دارن چون در بعضی جاها به جای هم به کار میرن.
بجای هم بکار نمیرن، کاربرد نزدیکی بهم دارند. پارامتر متغیری است که در تعریف متد می بینید، آرگومان مقداری است که در اون پارامتر میشینه.
اگر تعریف متد Test به شکل Test(string message) باشه، message پارامتر اونه و در Test("Hello") اون "Hello" آرگومانی است که به Test ارسال میشه. آرگومان خودش میتونه یک متغیر باشه که ارسال میشه ولی به هر حال موقع اجرای متد یک مقداره.

- کامپوننت چیه؟ مثلا نوشته شده که منوها و کنترل ها کامپوننت هستن اما تا جایی که می دونم کنترل ها کلاس هستن.
کامپوننت مجموعه ای است از کد ها، داخلش میتونه چندین کلاس باشه، کلاس هایی که کنترل هایی برای قرار گرفتن روی ویندوز هستند و ... یعنی هر کنترل به تنهایی الزاما یک کمپوننت مستقل نیست. ممکنه یک کمپوننت صد تا کنترل و صد ها کلاس داخلش باشه. یا اصلا کمپوننت ای باشه که هیچ کنترل قابل نمایشی نداشته باشه.
ولی به هر حال کمپوننت معمولا خودش به تنهایی اجرا نمیشه، کمپوننت برای استفاده با برنامه تون ترکیب میشه.
نوشته متد show یک متد static هستش چون با نام کلاسش فراخوانی می شه. این static به چه معناست و آیا تفاوتش با متد غیر static فقط همینه. مثلا آیا متد writeline هم static هستش چون اون هم با console میاد. آیا متدی در سی شارپ داریم که مثل show باشه اما static نباشه.
در همین تاپیک می توانید در مورد static و non-static ها جستجو کنید. #C یک زبانه، اسامی کلیدی اش هم در حد همون if for do else private static و ... بیشتر نیست. اینکه اسم متدی show باشه و این متد static باشه یا نه ربطی به زبان نداره. show جزئی از زبان #C نیست.

3- این جمله ها نوشته شده:

"کلاس های درون فایل کامپایل میشن و پسوند exe یا dll می گیرن که به این ها اسمبلی می گویند. که این اسمبلی ها شامل کدهای MSIL هستن"

" کلاس MessageBox در فضای کاری System.Windows.Forms قرار داره و کلاس console در فضای کاری system.

"کلاس MessageBox در فایل اسمبلی System.Windows.Forms.dll قرار داره و کلاس console در فایل اسمبلی mscorlib.dll"

سوالات:

1- کلاس های درون کدوم فایل ها کامپایل میشن و پسوند exe یا dll می گیرن. کلاس هایی که از قبل در سی شارپ وجود داره یا کلاس هایی که ما می نویسیم.
فقط کد هایی که شما می نویسید یا کد و پروژه اش را از کسی گرفته اید کامپایل میشه، کدی که قبلا کامپایل شده و در dll ای مثل System.Windows.Forms.dll قرار گرفته دیگه چیزی برای کامپایل شدن نداره.

2- به طور کلی کدوم فایل ها exe میشن و کدوم فایل ها dll. و اینکه dll چه نوع فایلی هست.
هر دوشون اجرایی هستند ولی dll کتابخانه است و برای استفاده در سایر کد ها. کتابخانه به تنهایی اجرا نمیشه.
هر برنامه ای که بخش اجرایی داره و خودش اجرا میشه exe است، dll بخش اجرا شدنی داره ولی خودش مستقلا اجرا شدنی نیست، dll توسط برنامه های دیگری استفاده و فراخوانی میشه. مثلا شما که در برنامه تون از فرم ها و کنترل های ویندوز استفاده می کنید از dll هایی استفاده می کنید که اون فرم ها و کنترل های ویندوز داخلشون تعریف شده.

3- طبق چیزی که من خوندم کدهای سی شارپ اول به MSIL تبدیل میشن و بعد به زبان ماشین. پس چرا هنوز توی اون فایل های اسمبلی کدهای MSIL وجود داره.
چون NET. ماشین مجازی داره، اون کد MSIL برای ماشین مجازی قابل فهمه. تبدیل به کد زبان ماشین موقع اجرا در داخل ماشین مجازی اتفاق می افته، نه زمان کامپایل شدن کدتون.
برای همینه که برنامه تون اینقدر انعطاف داره که میتونه بدون نیاز به کامپایل مجدد در محیط 64 بیتی، 64 بیتی اجرا بشه و در محیط 32 بیتی، 32 بیتی.

4- اینکه ما بدونیم کلاس console در فلان فایل اسمبلی وجود داره تاثیری داره و باید همه کلاس ها رو حفظ کنیم که در کدام فایل اسمبلی هستن.
نه، چه اهمیتی داره. از اون اطلاعاتی است که همیشه با چند تا کلیک ساده قابل فهمیدنه، حفظ کردنشون کمکی بهتون نمی کنه.

5- نوشته همه کلاس ها به ارجاع نیاز دارن اما کلاس console به ارجاع نیاز نداره. این ارجاع ها در کجا ثبت میشن و ما از کجا می تونیم بفهمیم که فلان کلاس ارجاع شده و اون یکی ارجاع نشده. و این ارجاع کاربردش چیه و چطوری باید یک کلاس رو ارجاع بدیم و به چه چیزی ارجاع بدیم.
من متوجه منظور از ارجاع و مفهوم این جمله همه کلاس ها نیاز به ارجاع دارند نشدم. شبیه جمله همه انسان ها به تفریح نیاز دارند ئه. خیال تون راحت. کلاس ها شخصا به چیزی نیاز ندارند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اه
استاد علی ، خیلی پیچیده و تو در تو میشه . هر تابعی که جلو میرم ، باز خودش اشاره گر به استراکچر دیگه میخواد (تا حالا حداقل 4 تا اشاره گر به استراکچر میخواد) باز پر کردن این فیلدها توسط تابع یا بصورت دستی و هم پر کردن ورودی های بقیه ی آرگومان های تابع ، خودش دنیایی هه .
میگم به نظرتون اینو ادامه بدم؟ یعنی بعد از این همه مقداردهی و ... ، به نظرتون جواب میده؟ یعنی میگم این همه را برم و جواب نگیرم ، به قول پسرخاله ام ستم هه :green:
با روندی که من دارم ، چند روزی طول میکشه اینا رو بخونم و مقداردهی کنم
 

the_king

مدیرکل انجمن
اه
استاد علی ، خیلی پیچیده و تو در تو میشه . هر تابعی که جلو میرم ، باز خودش اشاره گر به استراکچر دیگه میخواد (تا حالا حداقل 4 تا اشاره گر به استراکچر میخواد) باز پر کردن این فیلدها توسط تابع یا بصورت دستی و هم پر کردن ورودی های بقیه ی آرگومان های تابع ، خودش دنیایی هه .

اول یک دید کلی به فعالیت تون داشته باشید، وارد موضوعی میشید که براتون تازگی داره، طبعا هم میتونه پر زحمت باشه و هم مدام نیاز به یادگیری موارد جدید داره. اگه از زحمت و نیاز به یادگیری پرهیز کنید که محدود میشید به دانسته های قبلی و هیچ کار جدیدی نمیشه کرد. خودتونم میتوانید در اینترنت ببینید که برنامه نویسانی که با دسترسی به اشیاء و ACL و SID و ... سر و کار دارند سطح کاری که می کنند مبتدی نیست، دانش اولیه شو دارند. برای کسب اش به صرف زمان و زحمت نیازه.

برای ساختاری که میگید حداقل چهار تا دلیل داره که اینقدر پیچیده میشه، اولین دلیلش اینه که تعریف دسترسی برای اشیاء ویندوز خودش به تنهایی در حد دو سه تا گزینه نیست، خیلی انعطاف پذیری داره که برای پیاده سازی اش اینجور پیچیدگی ساختار رو میطلبه. نباید توقع داشته باشین که با یک ساختار ساده طراحی شده باشه. دلیل دوم اینه که شما دارید با زبان دیگری بجز زبان طراحی شده اش که C++/C ارتباط برقرار می کنید که مجبورتون میکنه یکسری بازنویسی ها رو انجام بدید و عملا Wrapper بنویسید. کسی که به زبان ++C/C کد نویسی موردی مثل alphavss رو انجام میده زحمت کمتری از شما داره. دلیل سوم اینه که شما دارید با بخش زیربنایی ویندوز و API ارتباط برقرار می کنید که همیشه زحمت بیشتری داره. شما حتی اگه به صورت سنتی با زبان ++C و API یک فرم و یک دکمه رویش بسازید و برای کلیک اش کد نویسی کنید می بینید چقدر کار کردن با API داخلی سخت تر از کار با امکانات ویژوال #C و VB.NET و ... ئه. چهارمین دلیل اینه که به یک محیط ویژوال و یک کتابخانه غنی با کاربری عالی عادت می کنید، همین شرایط رو هر برنامه نویسی که به ویژوال بیسیک عادت کرده با ++C و جاوا داره و تو شروع کار زود زده میشه.
در ضمن در این مساله ای که شما براتون پیش اومده برای کسی که داره Wrapper مینویسه کاملا عادیه، قبلا توصیفش کرده بودم :
گفتگو هایی در باب سی شارپ
در ضمن برای وجود Wrapper خاصی برای کاری که خودتون دارید انجام میدید جستجو نمی کنید و همیشه احتمالش هست که چرخ رو از نو اختراع می کنید.
همچنین دارید کدی می نویسید که اگه ادامه بدیدش مدام متمایل میشه به سمت بازنویسی بخشی از System.Security که در خود NET. هست.
اگه روی System.Security شناخت کافی پیدا نکنید به ضرر تونه چون نمیدونید چی از قبل آماده هست و چی نیست چون در راهنمای API که بهتون نمیگه اگه برنامه نویس #C هستید فلانجاشو ننویسید که فلان مورد در NET. هست. یکراست متمرکزتون میکنه روی API ویندوز.

برای زمان در کد نویسی روز خیلی واحد کوچیکی ئه، مخصوصا که یک نفر هستید و بدون دانش اولیه سطر به سطر هم کد می نویسید و هم یاد میگیرید. خیلی فرق می کنه با کسی که از قبل موضوع رو کامل یادگرفته و حالا با دانش قبلی کد نویسی می کنه. چهار روز که زمان زیادی نیست. البته شما بیشتر مدت مشغول یادگیری هستید، نه کد نویسی. مواردی پیش میاد که برای یک متد باید چند هفته زمان صرف بشه چون کاری با سابقه و دانش قبلی نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون . همونطور که گفتین ، system.security هم خیلی کمک کرد ولی ای کاش پیدا کردن منبع ای که به موضوع ام ربط داشت ، آسون تر بود
استاد علی ، بی زحمت میتونین ببینین تا اینجا رفتم درسته یا نه؟
کد تعریفات (declare) :


کد:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace VSS
{
    public class CoInitSecure
    {
        [DllImport("ole32.dll")]
        public static extern int CoInitializeSecurity(IntPtr pSecDesc,
        int cAuthSvc, IntPtr asAuthSvc, IntPtr pReserved1, RpcAuthnLevel dwAuthnLevel,
        RpcImpLevel dwImpLevel, IntPtr pAuthList, EoAuthnCap dwCapabilities, IntPtr pReserved3);
    }

    public class SECURITY_DESCRIPTOR
    {
        public const int SECURITY_DESCRIPTOR_MIN_LENGTH = 20;
        public const int SECURITY_DESCRIPTOR_REVISION = 1;
        public const int ERROR_SUCCESS = 0;  // no error


        [DllImport("Advapi32.dll")]
        public static extern bool InitializeSecurityDescriptor(IntPtr pSecurityDescriptor, uint dwRevision);

        [DllImport("Advapi32.dll")]
        public static extern uint SetSecurityDescriptorRMControl(IntPtr pSecurityDescriptor, ref int pRMControlInt);

        [DllImport("Advapi32.dll")]
        public static extern bool SetSecurityDescriptorOwner(IntPtr pSecurityDescriptor, IntPtr pOwnerSID, bool bOwnerDefaulted);
    }

    public enum RpcAuthnLevel
    {
        Default = 0,
        None = 1,
        Connect = 2,
        Call = 3,
        Pkt = 4,
        PktIntegrity = 5,
        PktPrivacy = 6
    }

    public enum RpcImpLevel
    {
        Default = 0,
        Anonymous = 1,
        Identify = 2,
        Impersonate = 3,
        Delegate = 4
    }

    public enum EoAuthnCap
    {
        None = 0x00,
        MutualAuth = 0x01,
        StaticCloaking = 0x20,
        DynamicCloaking = 0x40,
        AnyAuthority = 0x80,
        MakeFullSIC = 0x100,
        Default = 0x800,
        SecureRefs = 0x02,
        AccessControl = 0x04,
        AppID = 0x08,
        Dynamic = 0x10,
        RequireFullSIC = 0x200,
        AutoImpersonate = 0x400,
        NoCustomMarshal = 0x2000,
        DisableAAA = 0x1000
    }
}

کد کلاس main (به کامنت ها دقت کنید که استفاده نمیشن) :


کد:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Security.Policy;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Principal;

namespace VSS
{
    public static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>

        //[STAThread]
        static void Main()
        {
            IntPtr ptrSecurityDescriptorStruct = Marshal.AllocHGlobal(SECURITY_DESCRIPTOR.SECURITY_DESCRIPTOR_MIN_LENGTH);

            bool isInitializeStructure = SECURITY_DESCRIPTOR.InitializeSecurityDescriptor(ptrSecurityDescriptorStruct, SECURITY_DESCRIPTOR.SECURITY_DESCRIPTOR_REVISION);
            if (isInitializeStructure == true)
            {
                MessageBox.Show("initialized");

                int pRMControlInt = 1;
                uint isSuccess = SECURITY_DESCRIPTOR.SetSecurityDescriptorRMControl(ptrSecurityDescriptorStruct, ref pRMControlInt);
               
                //string domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
                //string userName = WindowsIdentity.GetCurrent().Name;


                SecurityIdentifier ownerSID = WindowsIdentity.GetCurrent().Owner;
                byte[] bufferManagedOSID = new byte[ownerSID.BinaryLength];
                ownerSID.GetBinaryForm(bufferManagedOSID, 0);
                IntPtr ptrownerSID = Marshal.AllocHGlobal(ownerSID.BinaryLength);
                Marshal.Copy(bufferManagedOSID, 0, ptrownerSID, ownerSID.BinaryLength);

                SECURITY_DESCRIPTOR.SetSecurityDescriptorOwner(ptrSecurityDescriptorStruct, ptrownerSID, false);

            }


            //    int res = CoInitSecure.CoInitializeSecurity(, -1, IntPtr.Zero,
            //IntPtr.Zero, RpcAuthnLevel.PktPrivacy,
            //RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }

}

از اینجا هم کمک گرفتم :

https://github.com/gavacho/System.M...ter/System.Messaging.MessageQueue.SetOwner.cs

SECURITY_DESCRIPTOR C# (CSharp) Code Examples - HotExamples

الان نمیشه آرایه ی managed را به unmanaged بصورت مستقیم بفرستیم . درسته؟ باید با کلاس Marshal عملیاتت اختصاص حافظه و کپی را انجام بدیم درسته؟

تا اینجا روند فراخونی توابع و کلاس ها و مقداردهی شون درسته؟
 

the_king

مدیرکل انجمن

الان نمیشه آرایه ی managed را به unmanaged بصورت مستقیم بفرستیم . درسته؟ باید با کلاس Marshal عملیاتت اختصاص حافظه و کپی را انجام بدیم درسته؟

نمیدونم منظورتون از ارسال مستقیم، بصورت خودکار و بدون استفاده از متد های Marshal ئه یا منظورتون دسترسی به خود حافظه Managed ئه. به خود حافظه Managed که اصلا دسترسی ای در کار نیست. مثل همون struct ها است که خودکار Marshalling میشه، ارسال میشه اما چیزی که در اختیار تابع خارجی قرار میگیره حافظه خود آرایه نیست، یک کپی از اونه که در حافظه Unmanaged قرار گرفته، یعنی کاری که با Marshal بصورت دستی انجام میدید رو بصورت خودکار انجام میده. این تبدیل خودکار میتونه برای موارد ساده ای مثل ارسال مستقیم آرایه به یک تابع کافی باشه ولی در مواردی که اون آرایه خودش در struct دیگه ای باید مورد اشاره قرار بگیره مشکل سازه، چون روال خودکار دیگه اونقدر هوشمندی نداره که بفهمه فلان تابع میخواد چه کاری با اشاره گری که در فلان struct هست انجام بده. برای همین در مواردی ناگزیر هستید خودتون بصورت دستی حافظه Unmanaged بسازید و روال خودکار رو نادیده بگیرید.
تا اینجا روند فراخونی توابع و کلاس ها و مقداردهی شون درسته؟
یادتون نره که این حافظه هایی که بصورت Unmanaged میسازید مسئولیت مدیریت شون معمولا با کد شما است بجز موارد معدودی که متدی صریحا مشخص کنه از زمان ارسال اش بصورت پارامتر خودش مدیریتش می کنه و دیگه نباید آزادش کنید. بنابراین حافظه ای که ایجاد می کنید رو باید نهایتا آزاد کنید. آدرس شون رو نگهدارید تا حداقل در انتهای اجرای برنامه تون اینکار رو با Marshal.FreeHGlobal انجام بدید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نمیدونم منظورتون از ارسال مستقیم، بصورت خودکار و بدون استفاده از متد های Marshal ئه یا منظورتون دسترسی به خود حافظه Managed ئه. به خود حافظه Managed که اصلا دسترسی ای در کار نیست. مثل همون struct ها است که خودکار Marshalling میشه، ارسال میشه اما چیزی که در اختیار تابع خارجی قرار میگیره حافظه خود آرایه نیست، یک کپی از اونه که در حافظه Unmanaged قرار گرفته، یعنی کاری که با Marshal بصورت دستی انجام میدید رو بصورت خودکار انجام میده. این تبدیل خودکار میتونه برای موارد ساده ای مثل ارسال مستقیم آرایه به یک تابع کافی باشه ولی در مواردی که اون آرایه خودش در struct دیگه ای باید مورد اشاره قرار بگیره مشکل سازه، چون روال خودکار دیگه اونقدر هوشمندی نداره که بفهمه فلان تابع میخواد چه کاری با اشاره گری که در فلان struct هست انجام بده. برای همین در مواردی ناگزیر هستید خودتون بصورت دستی حافظه Unmanaged بسازید و روال خودکار رو نادیده بگیرید.

ممنون استاد علی
منظورم بصورت خودکار و بدون استفاده از متد های Marshal هست . در این صورت باید از اتریباتس MarshalAsAttribute استفاده کنم؟ یا چیزی لازم نیست؟


یادتون نره که این حافظه هایی که بصورت Unmanaged میسازید مسئولیت مدیریت شون معمولا با کد شما است بجز موارد معدودی که متدی صریحا مشخص کنه از زمان ارسال اش بصورت پارامتر خودش مدیریتش می کنه و دیگه نباید آزادش کنید. بنابراین حافظه ای که ایجاد می کنید رو باید نهایتا آزاد کنید. آدرس شون رو نگهدارید تا حداقل در انتهای اجرای برنامه تون اینکار رو با Marshal.FreeHGlobal انجام بدید.

بله اینو میدونم . هنوز کدم تموم نشده . دنیایی موند . این کارها را معمولا سر آخر میذارم .
اما من بیشتر منظورم این بود که مقداردهی هایی که کردم ، درسته؟

بعد اینکه الان در کد پست قبلی ، دومین ورودی متد SetSecurityDescriptorOwner ، اشاره گر به استراکچر SecurityIdentifier میخواد ولی من طبق اون لینکی که دادم ، از یه کلاس System.Security.Principal.SecurityIdentifier بصورت managed استفاده کردم و اطلاعات این کلاس را توی یه آرایه ی managed و بعد توی آرایه ی unmanaged ریختم و عملا اشاره گر به آرایه ی unmanaged را به این متد دادم . اشکال داره؟ اگه اشکال داره ، روشی هست که اولا یه کلاس managed را به استراکچر managed در سی شارپ تبدیل کنیم تا بعد بتونیم با استفاده از متد Marshal.StructureToPtr ، استراکچر managed را به استراکچر unmanaged تبدیل کنیم؟

بعد اینکه دومین ورودی متد SetSecurityDescriptorGroup :

SetSecurityDescriptorGroup function

اشاره گری به SecurityIdentifier میخواد اما sid برای Group را میخواد (قبلی sid برای Owner بود) .
حالا توی دات نت یه کدی هست :

کد:
SecurityIdentifier uSID = WindowsIdentity.GetCurrent().User;
که میگه sid برای User را برمیگردونه . آیا این کد همونی هه که دومین ورودی متد SetSecurityDescriptorOwner میخواد؟
یا اینکه کد :

کد:
IdentityReferenceCollection gSID = WindowsIdentity.GetCurrent().Groups;
کالکشنی از IdentityReference را برمیگردونه که این کلاس ، پدر کلاس SecurityIdentifier هست . منظور ورودی دومین متد ، به کدوم یک از اینهاست؟
ممنون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون استاد علی
منظورم بصورت خودکار و بدون استفاده از متد های Marshal هست . در این صورت باید از اتریباتس MarshalAsAttribute استفاده کنم؟ یا چیزی لازم نیست؟
به موردش بستگی داره ولی در اغلب موارد نیازی نیست و بود و نبودش تاثیری نداره. بیشترین مواردی که راهنمایی MarshalAs لازم میشه برای رشته ها است که کدینگ های متفاوتی میتونه داشته باشه.

بله اینو میدونم . هنوز کدم تموم نشده . دنیایی موند . این کارها را معمولا سر آخر میذارم .
اما من بیشتر منظورم این بود که مقداردهی هایی که کردم ، درسته؟
ظاهرا درسته، من مورد اشکال داری ندیدم.

بعد اینکه الان در کد پست قبلی ، دومین ورودی متد SetSecurityDescriptorOwner ، اشاره گر به استراکچر SecurityIdentifier میخواد ولی من طبق اون لینکی که دادم ، از یه کلاس System.Security.Principal.SecurityIdentifier بصورت managed استفاده کردم و اطلاعات این کلاس را توی یه آرایه ی managed و بعد توی آرایه ی unmanaged ریختم و عملا اشاره گر به آرایه ی unmanaged را به این متد دادم . اشکال داره؟ اگه اشکال داره ، روشی هست که اولا یه کلاس managed را به استراکچر managed در سی شارپ تبدیل کنیم تا بعد بتونیم با استفاده از متد Marshal.StructureToPtr ، استراکچر managed را به استراکچر unmanaged تبدیل کنیم؟
نه، اشکالی نداره. اگه توضیحات متد ها رو بخونید می بینید که اشاره گری که بهشون میدهید مستقیما استفاده میشن، کپی داده صورت نمیگیره که بتوانید به محض اجرای متد اشاره گرتون رو دور بریزید، باید نگهش دارید. برای همینه که هم استفاده از Marshal و حافظه Unmanaged و نگهداری اشاره گر در طول اجرا لازمه. پس اینی که حافظه Unmanaged ساخته شده بیخودی و اضافی نیست. تبدیل داده های یک شی از کلاس به struct هم به این روش که مد نظرتونه بی معنیه، در نظر بگیرید که شی از کلاس فلان حتی از نظر داده ای هم بهش نگاه کنید، شامل مقادیر متغیر های private اش هم هست که شما در ظاهر نمی بینید. پس حتی اگر به روشی به struct تبدیل میشد، ابدا به struct ای که تصور می کنید شباهتی نداره. برای کلاس ها Serial ما مبحث Serialization رو داریم که تبدیل داده شیء به یک فرمت قابل انتقاله که اونم ارتباطی با این چیزی که میخواهید نداره. اما از طرف دیگه Marshal.StructureToPtr حقیقتا تبدیلی انجام نمیده، فقط کپی داده میکنه، داده struct رو کپی می کنه در یک حافظه Unmanaged. مثل اینه که شما از شیء از کلاس فلان ابتدا مقدار مشخصه فلان و بعد مشخصه بهمان رو کپی کنید در یک حافظه Unmanaged. این کپی کردن برای struct ها هم که روال مشخص و عمومی ای داره چون ترتیب فیلد ها خیلی واضحه.

بعد اینکه دومین ورودی متد SetSecurityDescriptorGroup :
SetSecurityDescriptorGroup function

اشاره گری به SecurityIdentifier میخواد اما sid برای Group را میخواد (قبلی sid برای Owner بود) .
حالا توی دات نت یه کدی هست :

کد:
SecurityIdentifier uSID = WindowsIdentity.GetCurrent().User;
که میگه sid برای User را برمیگردونه . آیا این کد همونی هه که دومین ورودی متد SetSecurityDescriptorOwner میخواد؟
User الزاما Owner نیست، میتونه در مثالی ایندو یکسان باشه ولی الزاما نه.
بنابراین اگه دنبال Owner باشید که کاری با User ندارید. از طرف دیگه User هم Group نیست.

کد:
IdentityReferenceCollection gSID = WindowsIdentity.GetCurrent().Groups;
کالکشنی از IdentityReference را برمیگردونه که این کلاس ، پدر کلاس SecurityIdentifier هست . منظور ورودی دومین متد ، به کدوم یک از اینهاست؟
ممنون
یکم از هدف تون دور شدید. شما این کد ها رو می نویسید که دسترسی مشخصی برای پروسه تون تعریف کنید که کاربران و پروسه های دیگه دسترسی شون محدود بشه، نه اینکه همون دسترسی های عادی که همینطوری هم پروسه داشت با زحمت دستی وارد کنید. شما که نمی خواهید دسترسی ها رو بجای اینکه محدودتر کنید به مجموعه کاربران زیر مجموعه یک گروه بسط بدید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
به موردش بستگی داره ولی در اغلب موارد نیازی نیست و بود و نبودش تاثیری نداره. بیشترین مواردی که راهنمایی MarshalAs لازم میشه برای رشته ها است که کدینگ های متفاوتی میتونه داشته باشه.


ظاهرا درسته، من مورد اشکال داری ندیدم.

خیلی ممنون استاد علی :rose:


نه، اشکالی نداره. اگه توضیحات متد ها رو بخونید می بینید که اشاره گری که بهشون میدهید مستقیما استفاده میشن، کپی داده صورت نمیگیره که بتوانید به محض اجرای متد اشاره گرتون رو دور بریزید، باید نگهش دارید. برای همینه که هم استفاده از Marshal و حافظه Unmanaged و نگهداری اشاره گر در طول اجرا لازمه. پس اینی که حافظه Unmanaged ساخته شده بیخودی و اضافی نیست.
تبدیل داده های یک شی از کلاس به struct هم به این روش که مد نظرتونه بی معنیه، در نظر بگیرید که شی از کلاس فلان حتی از نظر داده ای هم بهش نگاه کنید، شامل مقادیر متغیر های private اش هم هست که شما در ظاهر نمی بینید. پس حتی اگر به روشی به struct تبدیل میشد، ابدا به struct ای که تصور می کنید شباهتی نداره. برای کلاس ها Serial ما مبحث Serialization رو داریم که تبدیل داده شیء به یک فرمت قابل انتقاله که اونم ارتباطی با این چیزی که میخواهید نداره. اما از طرف دیگه Marshal.StructureToPtr حقیقتا تبدیلی انجام نمیده، فقط کپی داده میکنه، داده struct رو کپی می کنه در یک حافظه Unmanaged. مثل اینه که شما از شیء از کلاس فلان ابتدا مقدار مشخصه فلان و بعد مشخصه بهمان رو کپی کنید در یک حافظه Unmanaged. این کپی کردن برای struct ها هم که روال مشخص و عمومی ای داره چون ترتیب فیلد ها خیلی واضحه.

دقیق متوجه ی منظورتون از پاراگراف اول نشدم (قسمتی که بولد کردم) . متوجه نشدم ربط اینکه اشاره گری از استراکچر میخواد ولی ما اشاره گری به آرایه دادیم و چرا مشکلی نخواهد گرفت



User الزاما Owner نیست، میتونه در مثالی ایندو یکسان باشه ولی الزاما نه.
بنابراین اگه دنبال Owner باشید که کاری با User ندارید.

ممنون

از طرف دیگه User هم Group نیست .
یکم از هدف تون دور شدید. شما این کد ها رو می نویسید که دسترسی مشخصی برای پروسه تون تعریف کنید که کاربران و پروسه های دیگه دسترسی شون محدود بشه، نه اینکه همون دسترسی های عادی که همینطوری هم پروسه داشت با زحمت دستی وارد کنید. شما که نمی خواهید دسترسی ها رو بجای اینکه محدودتر کنید به مجموعه کاربران زیر مجموعه یک گروه بسط بدید.

من الان دقیق متوجه نشدم . من الان برای دومین ورودی متد SetSecurityDescriptorGroup ، نباید از دستورات :


کد:
SecurityIdentifier uSID = WindowsIdentity.GetCurrent().User;

یا


کد:
IdentityReferenceCollection gSID = WindowsIdentity.GetCurrent().Groups;

استفاده کنم ؟ به نظر میاد باید از کد دوم استفاده کنم و همه ی پروپرتی value در کالکشن را به آرایه (مثل کد قبلی) تبدیل کنم و به دومین ورودی متد بدم .
---------------------------------------------
بعد اینکه من میتونم از کلاس های System.Security.AccessControl.CommonSecurityDescriptor یا GenericSecurityDescriptor در دات نت برای ورودی اول متد CoInitializeSecurity (که اشاره گری به استراکچر SecurityDescriptor میخواد) استفاده کنم؟
ودیگه این همه دردسر برای پیگیری api های ویندوز نکشم .
اگه آره ، از کدوم کلاس بالا استفاده کنم؟
 

the_king

مدیرکل انجمن
دقیق متوجه ی منظورتون از پاراگراف اول نشدم (قسمتی که بولد کردم) . متوجه نشدم ربط اینکه اشاره گری از استراکچر میخواد ولی ما اشاره گری به آرایه دادیم و چرا مشکلی نخواهد گرفت
ویژگی هایی که قبلا در مورد مدیریت حافظه ویندوز و حافظه Managed و GC گفته بودم رو بخاطر بیارید، حافظه ای که شما در کدتون برای متغیر فلان دارید ممکنه این لحظه فلانجا باشه، لحظه بعد یک جای دیگه. و چون از داخل محیط Managed ئه برای دسترسی از محیط Unmanaged قابل اتکا نیست. وقتی هم که آخرین ارجاع و نیاز به داده از بین بره GC هر لحظه امکان آزاد سازی شو داره، اینها رو که یادتون هست؟ تو این شرایط تصور کنید که یک تابع خارجی از شما آدرس حافظه ای رو میخواد که قراره مدت طولانی ای مورد استفاده اش باشه یعنی خودشم میگه که نمیخواد سریع از روی داده اش کپی کنه و میخواد همچنان در طی زمان طولانی از همون آدرس استفاده کنه، نه فقط همین الان :
a.jpg
پس نمی توانید آدرس حافظه ای رو بهش بدهید که ممکنه لحظه بعد دیگه معتبر نباشه، باید آدرس حافظه ای رو بدهید که جابجا نشه و احتمال آزاد سازیش توسط GC هم نباشه، خود bufferManagedOSID که همچین خصوصیاتی رو نداره. حتی Marshalling ای که بصورت خودکار روی bufferManagedOSID انجام بشه هم نمیتونه بفهمه که این آدرس حافظه باید بعد از اجرا شدن تابع همچنان معتبر بمونه. خیال میکنه که اجرای تابع که تموم شد دیگه نیازی بهش نیست و میتونه آزادش کنه. چیزی که برای تابع مورد استفاده شما مشکل سازه.
من الان دقیق متوجه نشدم . من الان برای دومین ورودی متد SetSecurityDescriptorGroup ، نباید از دستورات :

کد:
SecurityIdentifier uSID = WindowsIdentity.GetCurrent().User;

یا


کد:
IdentityReferenceCollection gSID = WindowsIdentity.GetCurrent().Groups;

استفاده کنم ؟ به نظر میاد باید از کد دوم استفاده کنم و همه ی پروپرتی value در کالکشن را به آرایه (مثل کد قبلی) تبدیل کنم و به دومین ورودی متد بدم .

آخه سوالتون به نظر خودتون عجیب نمیاد. Groups که مجموعه گروه های کاربری است، اونم با اسمشون، نه SID شون. ثانیا من اگه بگم در کدتون بنویسید uSID = uSID به نظرتون ابهام نیست که اینکار برای چیه و چرا باید در کدم همچین چیزی رو بنویسم؟ الان براتون چقدر کارکرد Group و SetSecurityDescriptorGroup مشخصه که حالا برای انتخاب مقادیر بین دو راهی گیر کرده باشید؟ صرفا که بر اساس اینکه یک متدی در جایی داریم که نباید ازش استفاده کنید. باید اول ببینید هدفتون چیه و به چه مواردی نیاز دارید و با چه توابعی به اون هدفتون میرسید. استفاده از SetSecurityDescriptorGroup یا مقدار دهی Group که هدف کد شما نیست. نمیخوام مدام حرف تکراری بزنم ولی همچنان آزمون و خطا میکنید. اول یک متد رو همینطوری انتخاب می کنید که بدون اینکه چیزی از ماهیتش بدونید فقط به این دلیل که فکر می کنید باید اجراش کنید و بعد حالا مساله تون این میشه که چطور ازش استفاده کنم که نهایتا تازه از روی اجراش شاید بفهمم چیکار میکنه یا شاید بفهمم بهش نیاز داشتم یا نه.
---------------------------------------------
بعد اینکه من میتونم از کلاس های System.Security.AccessControl.CommonSecurityDescriptor یا GenericSecurityDescriptor در دات نت برای ورودی اول متد CoInitializeSecurity (که اشاره گری به استراکچر SecurityDescriptor میخواد) استفاده کنم؟
ودیگه این همه دردسر برای پیگیری api های ویندوز نکشم .
اگه آره ، از کدوم کلاس بالا استفاده کنم؟

طبیعتا هر دو چون هر کلاسی از این سری GenericSecurityDescriptor که بهتون GetBinaryForm بده همون داده ای است که در struct ئه قرار میگیره و قابل استفاده است. اما اگه منظورتون از دردسر پیگیری اینه که برای یادگیری مفهوم دسترسی ها و کاربرد کلاس های NET. اش نیازی به صرف کردن وقت ندارید در اشتباهید.
کد:
            var sd = new System.Security.AccessControl.RawSecurityDescriptor(string.Empty);
            var bytes = new byte[sd.BinaryLength];
            sd.GetBinaryForm(bytes, 0);
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ویژگی هایی که قبلا در مورد مدیریت حافظه ویندوز و حافظه Managed و GC گفته بودم رو بخاطر بیارید، حافظه ای که شما در کدتون برای متغیر فلان دارید ممکنه این لحظه فلانجا باشه، لحظه بعد یک جای دیگه. و چون از داخل محیط Managed ئه برای دسترسی از محیط Unmanaged قابل اتکا نیست. وقتی هم که آخرین ارجاع و نیاز به داده از بین بره GC هر لحظه امکان آزاد سازی شو داره، اینها رو که یادتون هست؟ تو این شرایط تصور کنید که یک تابع خارجی از شما آدرس حافظه ای رو میخواد که قراره مدت طولانی ای مورد استفاده اش باشه یعنی خودشم میگه که نمیخواد سریع از روی داده اش کپی کنه و میخواد همچنان در طی زمان طولانی از همون آدرس استفاده کنه، نه فقط همین الان :
مشاهده پیوست 112222
پس نمی توانید آدرس حافظه ای رو بهش بدهید که ممکنه لحظه بعد دیگه معتبر نباشه، باید آدرس حافظه ای رو بدهید که جابجا نشه و احتمال آزاد سازیش توسط GC هم نباشه، خود bufferManagedOSID که همچین خصوصیاتی رو نداره. حتی Marshalling ای که بصورت خودکار روی bufferManagedOSID انجام بشه هم نمیتونه بفهمه که این آدرس حافظه باید بعد از اجرا شدن تابع همچنان معتبر بمونه. خیال میکنه که اجرای تابع که تموم شد دیگه نیازی بهش نیست و میتونه آزادش کنه. چیزی که برای تابع مورد استفاده شما مشکل سازه.

خیلی ممنون استاد علی
بله یادم هست . متوجه شدم .
اما منظورم اینه وقتی اون میگه اشاره گری از استراکچرها میخواد ، خوب اگه حتی داخل تابع اش ، نام فیلدها را فراخونی نکنه ، بر اساس انواع و اندازه ی فیلدهای استراکچرش از اشاره گری که بهش دادیم استفاده میکنه دیگه . یعنی در استراکچر :

_SID

دو تا فیلد با اندازه ی 1 بایت و دو تا هم با اندازه ی 4 بایت و یکی هم با اندازه ی اشاره گر (4 یا 8 بایت) داریم که اندازه هاشون متفاوت اند . اما وقتی اشاره گر به آرایه میدیم ، همه ی اندازه ی اعضاشون برابره .
بعد هم وقتی یه اشاره گر استراکچر را به کدهای unmanaged میفرستیم (یا از طریق Marshal یا غیر از اون) ، توی حافظه های unmanaged کپی میشن و اشاره گر اونها فرستاده میشه دیگه؟ درسته؟ وگرنه همونطور که گفتید ، کدهای Managed و Unmanaged که نمیتونن با هم ارتباط داشته باشن و مقادیر همدیگه را استفاده کنن .


آخه سوالتون به نظر خودتون عجیب نمیاد. Groups که مجموعه گروه های کاربری است، اونم با اسمشون، نه SID شون. ثانیا من اگه بگم در کدتون بنویسید uSID = uSID به نظرتون ابهام نیست که اینکار برای چیه و چرا باید در کدم همچین چیزی رو بنویسم؟ الان براتون چقدر کارکرد Group و SetSecurityDescriptorGroup مشخصه که حالا برای انتخاب مقادیر بین دو راهی گیر کرده باشید؟ صرفا که بر اساس اینکه یک متدی در جایی داریم که نباید ازش استفاده کنید. باید اول ببینید هدفتون چیه و به چه مواردی نیاز دارید و با چه توابعی به اون هدفتون میرسید. استفاده از SetSecurityDescriptorGroup یا مقدار دهی Group که هدف کد شما نیست. نمیخوام مدام حرف تکراری بزنم ولی همچنان آزمون و خطا میکنید. اول یک متد رو همینطوری انتخاب می کنید که بدون اینکه چیزی از ماهیتش بدونید فقط به این دلیل که فکر می کنید باید اجراش کنید و بعد حالا مساله تون این میشه که چطور ازش استفاده کنم که نهایتا تازه از روی اجراش شاید بفهمم چیکار میکنه یا شاید بفهمم بهش نیاز داشتم یا نه.

Groups که مجموعه گروه های کاربری است یعنی مجموعه ای از User (account( هاست . چون کامپیوتری که این برنامه توش اجرا میشه ، فقط برای یک اکنت هه ، پس بجاش میشه از کد sid برای user استفاده کنم؟ این جمله ام غلط هه؟
یا کلا این پارامتر را null بفرستم؟
البته الان بذارید قضیه ی RawSecurityDescriptor که در پایین گفتین مشخص بشه چون اگه اون درست بشه ، دیگه نیازی به این استراکچرها و مقداردهی شون در وهله و دید اول ، نباید باشه .


طبیعتا هر دو چون هر کلاسی از این سری GenericSecurityDescriptor که بهتون GetBinaryForm بده همون داده ای است که در struct ئه قرار میگیره و قابل استفاده است. اما اگه منظورتون از دردسر پیگیری اینه که برای یادگیری مفهوم دسترسی ها و کاربرد کلاس های NET. اش نیازی به صرف کردن وقت ندارید در اشتباهید.
کد:
            var sd = new System.Security.AccessControl.RawSecurityDescriptor(string.Empty);
            var bytes = new byte[sd.BinaryLength];
            sd.GetBinaryForm(bytes, 0);

خیلی ممنون
من کد زیر را با راهنمایی تون نوشتم :


کد:
RawSecurityDescriptor sd = new RawSecurityDescriptor(string.Empty);
            byte[] bytes = new byte[sd.BinaryLength];
            sd.GetBinaryForm(bytes, 0);
            IntPtr ptrSD = Marshal.AllocHGlobal(sd.BinaryLength);
            Marshal.Copy(bytes, 0, ptrSD, sd.BinaryLength);

            int res = CoInitSecure.CoInitializeSecurity(ptrSD, -1, IntPtr.Zero,
        IntPtr.Zero, RpcAuthnLevel.PktPrivacy,
        RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);

            MessageBox.Show(res.ToString());

ولی خروجی متد CoInitializeSecurity ، مقدار 2147023535- را بهم میده که نمیدونم واسه کدوم ارور هه .
این شی sd در بالا ، پروپرتی های Owner و Group و SystemAcl و DiscretionaryAcl اش null هه . میگم این خروجی منفی متد CoInitializeSecurity (که طبعا باید واسه ی درست اجرا نشدن باشه) ، بخاطر همین null بودنِ این مقادیره؟
اگه آره ، باید از متدهای سازنده ی دیگه ی RawSecurityDescriptor ، مقداردهی شون کنیم؟
 

the_king

مدیرکل انجمن
دو تا فیلد با اندازه ی 1 بایت و دو تا هم با اندازه ی 4 بایت و یکی هم با اندازه ی اشاره گر (4 یا 8 بایت) داریم که اندازه هاشون متفاوت اند . اما وقتی اشاره گر به آرایه میدیم ، همه ی اندازه ی اعضاشون برابره .
نه نوع داده و نه اندازه خانه های آرایه تاثیری در رفتار با اشاره گر نداره، هیچ فرقی نمی کنه که n بایت حافظه رو با آرایه بایتی ساخته باشید یا آرایه از نوع دیگری. مهم اینه که طول آرایه بر حسب بایت به اندازه کافی باشه. اعضاء آرایه برای دریافت کننده اشاره گر نه معنی داره و نه قابل تشخیصه.

بعد هم وقتی یه اشاره گر استراکچر را به کدهای unmanaged میفرستیم (یا از طریق Marshal یا غیر از اون) ، توی حافظه های unmanaged کپی میشن و اشاره گر اونها فرستاده میشه دیگه؟ درسته؟ وگرنه همونطور که گفتید ، کدهای Managed و Unmanaged که نمیتونن با هم ارتباط داشته باشن و مقادیر همدیگه را استفاده کنن .
بله، منم که همین رو گفتم. یک حافظه Unmanaged برای این منظور تخصیص داده میشه ، توی اون حافظه کپی میشه و اشاره گر به اون حافظه است که توسط تابع دریافت میشه، اما درست بلافاصله بعد از پایان اجرای تابع اون حافظه Unmanaged آزاد میشه. همونطور که خودکار ایجاد شده بود همونطور هم خودکار آزاد میشه.

Groups که مجموعه گروه های کاربری است یعنی مجموعه ای از User (account( هاست . چون کامپیوتری که این برنامه توش اجرا میشه ، فقط برای یک اکنت هه ، پس بجاش میشه از کد sid برای user استفاده کنم؟ این جمله ام غلط هه؟
بله، غلطه، کلاس مجموعه ای از دانش آموزان ئه، مثل کلاس اول ب یا کلاس دوم ج. حالا اگه در کلاس فقط یک دانش آموز باشه میشه بجای کلاس نام دانش آموز باشه؟ مثلا کلاس پوریا جعفری یا کلاس شهریار فدایی؟ نمیشه چون دانش آموز که کلاس نیست.

یا کلا این پارامتر را null بفرستم؟
پارامتر کدوم تابع؟ شما اول باید براتون مشخص باشه که چرا باید از تابعی استفاده کنید و بعد تازه سر مقداری که بهش میفرستید فکر کنید.
شما لطف کنید به من در مورد این Group و نقش اش توضیح بدید که مشخص بشه برای چه منظوری مقدار دهیش میکنید تا بعدا برسیم به بحث مقدار مناسب.
البته الان بذارید قضیه ی RawSecurityDescriptor که در پایین گفتین مشخص بشه چون اگه اون درست بشه ، دیگه نیازی به این استراکچرها و مقداردهی شون در وهله و دید اول ، نباید باشه .

RawSecurityDescriptor هم مثل بقیه باید مقدار دهی مناسب بشه، وقتی ندونید چه کار می خواهید باهاش بکنید مقادیر هم مشخص نیست.

خیلی ممنون
من کد زیر را با راهنمایی تون نوشتم :
کد:
RawSecurityDescriptor sd = new RawSecurityDescriptor(string.Empty);
            byte[] bytes = new byte[sd.BinaryLength];
            sd.GetBinaryForm(bytes, 0);
            IntPtr ptrSD = Marshal.AllocHGlobal(sd.BinaryLength);
            Marshal.Copy(bytes, 0, ptrSD, sd.BinaryLength);

            int res = CoInitSecure.CoInitializeSecurity(ptrSD, -1, IntPtr.Zero,
        IntPtr.Zero, RpcAuthnLevel.PktPrivacy,
        RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);

            MessageBox.Show(res.ToString());

ولی خروجی متد CoInitializeSecurity ، مقدار 2147023535- را بهم میده که نمیدونم واسه کدوم ارور هه .
این شی sd در بالا ، پروپرتی های Owner و Group و SystemAcl و DiscretionaryAcl اش null هه . میگم این خروجی منفی متد CoInitializeSecurity (که طبعا باید واسه ی درست اجرا نشدن باشه) ، بخاطر همین null بودنِ این مقادیره؟

هنوز موضوع رو یاد نگرفته پریدید سر کد نویسی؟
چیزی مهمتر از اون، revision level اش صفر ئه. شما یک security descriptor کاملا خالی رو ارسال کردید که خطای ERROR_BAD_DESCRIPTOR_FORMAT رو برگردونده.
اگه آره ، باید از متدهای سازنده ی دیگه ی RawSecurityDescriptor ، مقداردهی شون کنیم؟
بایدی در کار نیست. اگه داده هایی که دارید مناسب پارامتر های RawSecurityDescriptor باشه از متد های سازنده RawSecurityDescriptor استفاده می کنید. به متد های سازنده اش نگاه بندازید، ببینید مقادیر مناسب شون رو دارید یا نه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه نوع داده و نه اندازه خانه های آرایه تاثیری در رفتار با اشاره گر نداره، هیچ فرقی نمی کنه که n بایت حافظه رو با آرایه بایتی ساخته باشید یا آرایه از نوع دیگری. مهم اینه که طول آرایه بر حسب بایت به اندازه کافی باشه. اعضاء آرایه برای دریافت کننده اشاره گر نه معنی داره و نه قابل تشخیصه.

خیلی ممنونم
این تیکه را متوجه نشدم . دلیلش هم متوجه نشدم که چرا

پارامتر کدوم تابع؟ شما اول باید براتون مشخص باشه که چرا باید از تابعی استفاده کنید و بعد تازه سر مقداری که بهش میفرستید فکر کنید.
شما لطف کنید به من در مورد این Group و نقش اش توضیح بدید که مشخص بشه برای چه منظوری مقدار دهیش میکنید تا بعدا برسیم به بحث مقدار مناسب.

RawSecurityDescriptor هم مثل بقیه باید مقدار دهی مناسب بشه، وقتی ندونید چه کار می خواهید باهاش بکنید مقادیر هم مشخص نیست.

نقش group رو نمیدونم اما اگه اشتباه نکنم ، یا باید پارامتر مربوط به owner را مقداردهی کرد یا group رو . درسته؟
بنابراین من کد را به شکل زیر تغییر دادم اما بازم همون عدد منفی را برمیگردونه :


کد:
            SecurityIdentifier ownerSID = WindowsIdentity.GetCurrent().Owner;
            RawSecurityDescriptor secDiscriptor = new RawSecurityDescriptor( ControlFlags.OwnerDefaulted, ownerSID, null, null, null);
            byte[] bufferManagedSecDescr = new byte[secDiscriptor.BinaryLength];
            secDiscriptor.GetBinaryForm(bufferManagedSecDescr, 0);
            CoInitSecure.ptrSecurityDiscriptor = Marshal.AllocHGlobal(secDiscriptor.BinaryLength);
            Marshal.Copy(bufferManagedSecDescr, 0, CoInitSecure.ptrSecurityDiscriptor, secDiscriptor.BinaryLength);
           
            int res = CoInitSecure.CoInitializeSecurity(CoInitSecure.ptrSecurityDiscriptor, -1, IntPtr.Zero,
            IntPtr.Zero, RpcAuthnLevel.PktPrivacy,
            RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);

            MessageBox.Show(res.ToString());

الان مشکل از اینه که در متد سازنده ی RawSecurityDescriptor ، پارامترهای systemAcl و discretionaryAcl را مقداردهی نکردم و اگه اینها را مقداردهی کنم ، درست میشه؟


هنوز موضوع رو یاد نگرفته پریدید سر کد نویسی؟
چیزی مهمتر از اون، revision level اش صفر ئه. شما یک security descriptor کاملا خالی رو ارسال کردید که خطای ERROR_BAD_DESCRIPTOR_FORMAT رو برگردونده.

بایدی در کار نیست. اگه داده هایی که دارید مناسب پارامتر های RawSecurityDescriptor باشه از متد های سازنده RawSecurityDescriptor استفاده می کنید. به متد های سازنده اش نگاه بندازید، ببینید مقادیر مناسب شون رو دارید یا نه.

الان revision level اش با مقداردهی پارامتر flags در متد سازنده ی RawSecurityDescriptor درست شد؟ در این کلاس ، عضوی بنام revision بصورت جداگانه نداره .
خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنونم
این تیکه را متوجه نشدم . دلیلش هم متوجه نشدم که چرا
شما از پروسه کامپایل شده #C تون به یک تابع کامپایل شده در کتابخانه API یک آرایه رو ارسال می کنید، آرایه از هر نوع داده ای که باشه Marshalling میشه و فقط یک اشاره گر ارسال میشه. تابعی که اون آدرس اشاره گر رو دریافت می کنه میفهمه که برنامه نویس کیه و این برنامه رو کی و به چه زبانی نوشته و داده های حافظه از چه نوع آرایه ای کپی شده؟ نه. تنها چیزی که دریافت کرده یک آدرس حافظه است. تو آدرس حافظه هم مقداری بایت قرار داره، همین. اینجا که دیگه کد هیچ زبان برنامه نویسی ای در کار نیست، زبان ماشینه، نه طول حافظه مشخص شده و نه اثری از نوع داده استفاده شده در زبان برنامه نویسی باقی مونده، فقط و فقط یک آدرس حافظه است با طول نامشخصی که معلوم نیست چند بایت ئه. برای همین نوع داده آرایه تاثیری در این قضیه نداره.

نقش group رو نمیدونم اما اگه اشتباه نکنم ، یا باید پارامتر مربوط به owner را مقداردهی کرد یا group رو . درسته؟
برایم جای ابهامه که چطوری میتوانید تشخیص بدید که اشتباه می کنید یا نمی کنید وقتی نقش شون رو نمی دونید و برای یادگیریش هم زمان صرف نمی کنید. می توانید بدون اینکه بدونید دسترسی ها بر چه اساسیه برای تعریف دسترسی کد نویسی کنید؟
بنابراین من کد را به شکل زیر تغییر دادم اما بازم همون عدد منفی را برمیگردونه :
کد:
            SecurityIdentifier ownerSID = WindowsIdentity.GetCurrent().Owner;
            RawSecurityDescriptor secDiscriptor = new RawSecurityDescriptor( ControlFlags.OwnerDefaulted, ownerSID, null, null, null);
            byte[] bufferManagedSecDescr = new byte[secDiscriptor.BinaryLength];
            secDiscriptor.GetBinaryForm(bufferManagedSecDescr, 0);
            CoInitSecure.ptrSecurityDiscriptor = Marshal.AllocHGlobal(secDiscriptor.BinaryLength);
            Marshal.Copy(bufferManagedSecDescr, 0, CoInitSecure.ptrSecurityDiscriptor, secDiscriptor.BinaryLength);
         
            int res = CoInitSecure.CoInitializeSecurity(CoInitSecure.ptrSecurityDiscriptor, -1, IntPtr.Zero,
            IntPtr.Zero, RpcAuthnLevel.PktPrivacy,
            RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);

            MessageBox.Show(res.ToString());

الان مشکل از اینه که در متد سازنده ی RawSecurityDescriptor ، پارامترهای systemAcl و discretionaryAcl را مقداردهی نکردم و اگه اینها را مقداردهی کنم ، درست میشه؟
اگه همینطوری به کد نویسی های شانسی و بختکی ادامه بدید تا دو سال دیگه هم درست شدنش جای تعجبه. OwnerDefaulted رو شانسی انتخاب کردید یا چون دیدید نوشته فقط resource manager ها اعمال میشه و صریحا گفته should not be set by callers انتخابش کردید؟

الان revision level اش با مقداردهی پارامتر flags در متد سازنده ی RawSecurityDescriptor درست شد؟ در این کلاس ، عضوی بنام revision بصورت جداگانه نداره .
خیلی ممنون
مقدارش یک ئه، به مقدار دهی فلگ ها کاری نداره، Revision نداره چون خودش موقع ایجاد ساختار از Revision ئه 1 استفاده می کنه، فرق می کنه با ساختاری که از یکسری بایت بخونید و Revision اش در اون بایت ها مشخص شده باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما از پروسه کامپایل شده #C تون به یک تابع کامپایل شده در کتابخانه API یک آرایه رو ارسال می کنید، آرایه از هر نوع داده ای که باشه Marshalling میشه و فقط یک اشاره گر ارسال میشه. تابعی که اون آدرس اشاره گر رو دریافت می کنه میفهمه که برنامه نویس کیه و این برنامه رو کی و به چه زبانی نوشته و داده های حافظه از چه نوع آرایه ای کپی شده؟ نه. تنها چیزی که دریافت کرده یک آدرس حافظه است. تو آدرس حافظه هم مقداری بایت قرار داره، همین. اینجا که دیگه کد هیچ زبان برنامه نویسی ای در کار نیست، زبان ماشینه، نه طول حافظه مشخص شده و نه اثری از نوع داده استفاده شده در زبان برنامه نویسی باقی مونده، فقط و فقط یک آدرس حافظه است با طول نامشخصی که معلوم نیست چند بایت ئه. برای همین نوع داده آرایه تاثیری در این قضیه نداره.

خیلی ممنونم .
نمیدونم چرا میگید : "نه طول حافظه مشخص شده و نه اثری از نوع داده استفاده شده در زبان برنامه نویسی باقی مونده"
اگه استراکچر باشه ، خوب طول فیلدهاش مشخص هه و طرف موقع فراخونی اش موظف هه که بر اساس طول فیلدها مقداردهی کنه . اگه آرایه بخواد که طول اعضا را مشخص میکنه که طرف موقع فراخونی اش موظف هه که بر اساس نوع داده (که اندازه ی اعضا شون مشخص میشه) مقدار آرایه رو بده . طول (تعداد اعضای) آرایه را هم میشه بدست آورد .
من قشنگ متوجه نشدم . به هر حال بماند .



برایم جای ابهامه که چطوری میتوانید تشخیص بدید که اشتباه می کنید یا نمی کنید وقتی نقش شون رو نمی دونید و برای یادگیریش هم زمان صرف نمی کنید. می توانید بدون اینکه بدونید دسترسی ها بر چه اساسیه برای تعریف دسترسی کد نویسی کنید؟

اگه همینطوری به کد نویسی های شانسی و بختکی ادامه بدید تا دو سال دیگه هم درست شدنش جای تعجبه. OwnerDefaulted رو شانسی انتخاب کردید یا چون دیدید نوشته فقط resource manager ها اعمال میشه و صریحا گفته should not be set by callers انتخابش کردید؟


مقدارش یک ئه، به مقدار دهی فلگ ها کاری نداره، Revision نداره چون خودش موقع ایجاد ساختار از Revision ئه 1 استفاده می کنه، فرق می کنه با ساختاری که از یکسری بایت بخونید و Revision اش در اون بایت ها مشخص شده باشه.

استاد علی ، کمک کنین .
بله میدونم مقدارش 1 هه . Revision را باید توی پارامتر systemAcl در متد سازنده ی RawSecurityDescriptor مقداردهی اش کنم؟
الان من باید چه اعضایی اش را مقداردهی کنم؟ flag را پس باید چی بذارم؟ چون دیدم توضیحات بخش OwnerDefaulted با توضیحات SECURITY_DESCRIPTOR_CONTROL در api ویندوز (پارامتر سوم تابع SetSecurityDescriptorOwner) شبیه هم هستن :

SECURITY_DESCRIPTOR_CONTROL - Windows applications

و هر دو مقدارشون 1 هه ، فکر کردم پارامتر flag را همین باید ست کرد . حواسم به بخش should not be set by callers اش نبود . الان مقدارش را باید چی بذارم؟ اصلا هم نمیدونم این پارامتر flag برابر کدوم پارامتر در کدوم تابع در api ویندوز هست تا با راهنمای اون عمل کنم .
الان همه ی sacl و dacl و group اش را هم باید مقداردهی کنم یا همه شون را لازم نیست مقداردهی کنم؟
توی راهنمای کلاس های دات نت که چیز خاصی نوشته نیست . من بر اساس راهنمای توابع در api ویندوز میرم .راهنمای پارامترها و remark ها را میخونم و بر اساس درک خودم مقداردهی میکنم که ممکنه غلط هم باشه چون چیزهایی اش را متوجه نمیشم .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
وقتی دارید از یک متد NET. استفاده می کنید منطق حکم می کنه که در راهنمای اون متد ببینید پارامتر هاش چیه و مقادیرش چیه و برای چه منظوریه. وقتی چیزی Wrapper موردی در API یا هر کتابخانه دیگری باشه طبعا مقادیر مشابه داخلشون هست، ولی این دلیلی برای انتخاب مقداری نیست که نمیدونید چیکار میکنه. هر متدی هم مربوط به موضوعاتی میشه که مستقل از خود متد باید بدونید. همه مولفه های تکنولوژی های مایکروسافت هم در سایت خودش شرح داده شده، چیزی نیست که بخواهید در منابع متفرقه دنبالش بگردید. طبعا اگه بخواهید برای موردی مثل ACL از متد ها استفاده کنید قبلش باید خود ACL رو بشناسید، نه اینکه بپرید سر کد نویسی متد ها.
بارها و بارها روش مطالعه و یادگیری استفاده رو بهتون یادآوری کردم، مدام گفتم این آزمون و خطا رو بگذارید کنار. تاپیک 50 صفحه رو گذشته اما همچنان همون کار اشتباهی رو می کنید که در شروع می کردید. چه فایده داره گفتن من وقتی بعد از تکرار مکررات تغییری در روال کار تون ندادید. وقت خودتون و من رو برای سوال و جوابهایی میگیرید که گفتن و نگفتن شون تاثیری نداره.
شما که برای استفاده از چیزی که ازش سر در نمیارید از خودتون متدولوژی اختراع میکنید، نیاز به کمک من ندارید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
وقتی دارید از یک متد NET. استفاده می کنید منطق حکم می کنه که در راهنمای اون متد ببینید پارامتر هاش چیه و مقادیرش چیه و برای چه منظوریه. وقتی چیزی Wrapper موردی در API یا هر کتابخانه دیگری باشه طبعا مقادیر مشابه داخلشون هست، ولی این دلیلی برای انتخاب مقداری نیست که نمیدونید چیکار میکنه. هر متدی هم مربوط به موضوعاتی میشه که مستقل از خود متد باید بدونید. همه مولفه های تکنولوژی های مایکروسافت هم در سایت خودش شرح داده شده، چیزی نیست که بخواهید در منابع متفرقه دنبالش بگردید. طبعا اگه بخواهید برای موردی مثل ACL از متد ها استفاده کنید قبلش باید خود ACL رو بشناسید، نه اینکه بپرید سر کد نویسی متد ها.
بارها و بارها روش مطالعه و یادگیری استفاده رو بهتون یادآوری کردم، مدام گفتم این آزمون و خطا رو بگذارید کنار. تاپیک 50 صفحه رو گذشته اما همچنان همون کار اشتباهی رو می کنید که در شروع می کردید. چه فایده داره گفتن من وقتی بعد از تکرار مکررات تغییری در روال کار تون ندادید. وقت خودتون و من رو برای سوال و جوابهایی میگیرید که گفتن و نگفتن شون تاثیری نداره.
شما که برای استفاده از چیزی که ازش سر در نمیارید از خودتون متدولوژی اختراع میکنید، نیاز به کمک من ندارید.

خیلی ممنون استاد علی
خوب منم که گفتم دونه دونه که همینجوری جلو میرم ، مستنداتی که مربوط به اون تابع و پارامترهاش و لینک هایی که از اونجا میده را میخونم . ولی انگار نیاز به اطلاعات گسترده تری داره . خوب من که نمیدونم چه چیزهایی لازمه . نمیدونم هم کدوم مقاله را باید بخونم یا ترتیب الویت اش کدوم هستن . مثلا درباره ی security descriptor و acl خیلی مقاله پیدا کردم :

[MS-AZOD]: Security Descriptor

Process Security and Access Rights - Windows applications

C-C++ Code Example: Creating a Security Descriptor

Modifying the ACLs of an Object in C++ - Windows applications

Defining Permissions with ACLs in C++ - Windows applications

Creating or Modifying an ACL - Windows applications

درباره ی group هم هیچ چیزی نمیدونم که اصلا چی هست .
من الان کدوم یک از لینک های بالا رو بخونم؟ یا شاید غیر از لینک های بالا لازم باشه که نمیدونم .
لطف میکنین یه لینکی بدین که نمونه کد کامل از مثال ++C برای ساخت شی و کلا استراکچر security descriptor برای امنیت process را مثال زده باشه؟ اگه مثال #C در این زمینه باشه که عالی میشه . اگه میشه ، کامل باشه چون تیکه تیکه را پیدا میکنم ولی مثال کامل (مخصوصا ساده) به سختی گیر میاد.

این داره خیلی وقت ازم میگیره. تصمیم گرفتم این قضیه ی security descriptor را در پس زمینه و با روال آروم با پیگیری کامل مستندات انجام بدم (حالا شاید هم به نتیجه برسم یا نه) و وقت بیشتر را برای پیگیری اصل vss و مستنداتش بذارم .
خیلی ممنون
 

جدیدترین ارسال ها

بالا