PDA

View Full Version : سوال: مشکل در سطح دسترسی‌ها در ویندوز 8 در VB.Net یا C#



Slytherin
دوشنبه 10 تیر 1392, 06:06 صبح
سلام و عرض خسته نباشید.
دوستان من قبلا هم این مشکل رو داشتم ولی الان به شدت من رو عصبی کرده...
مشکلم اینه که برنامه هام به خوبی در ویندوزهای XP و Seven و Vista کار میکنه ولی وقتی نوبت به ویندوز 8 میرسه به خاطر تغییراتی که در سطح دسترسی ها انجام داده باعث میشه که تمامی امکانات برنامه به خوبی کار نکنه...
مثلا وقتی می خوام رجیستری رو تغییر بدم ارور میده که شما دسترسی ندارید و باید با سطح دسترسی Administrator این کار رو انجام بدید. حتی من manifest رو تغییر دادم که این مجوز از خود کاربر گرفته بشه ولی نشد... تنها راهش اینه که کاربر خودش روی فایل راست کلیک کنه و Run As Administrator رو انتخاب کنه. (خب کاربر که دست کف بو نکرده!)
مشکل دومم اینه که برنامه هایی که نیاز به سطح دسترسی Administrator دارند حتی اگر توسط یک برنامه جانبی توی فولدر Startup یا توی رجیستری برای شروع خودکار قرار گرفته باشند، باز هم پس از بالا آمدن ویندوز اجرا نمی شوند!!
خب به طور ساده الان اگه قرار باشه که شما برنامه تون رو به طور خودکار در ویندوز 8 اجرا کنید چیکار می کنید؟! هر راهی باشه من قبولش دارم ولی خودم به هیچ نتیجه نرسیدم :|
منتظر ارایه پیشنهادات از دوستان و مهندسین عزیز هستم چون تمام پروژه هام لنگ همین قضیه هستند و من واقعا نمی دونم که دیگه باید چیکار کنم...
***
در ضمن فراموش کردم بگم. آگر خواستید با کد راهنمایی کنید فرقی نمیکنه که کد VB.Net باشه یا C# :|
***
پی نوشت:
کلا به نظرتون مسخره نیست که تالارهای VB.Net و C# جدا هستند؟ :| خب فرض کنید برای یکی یه سؤالی پیش بیاد و با توجه به ساختار یکسان دات نت براش فرقی نداشته باشه که با چه زبانی راهنمایی بگیره، یعنی در این حالت باید هر دو جا تایپیک بزنه؟ منطقیه؟ (خواهشا در خصوص این قضیه اینجا بحث نکنید.)

امین مستانی
دوشنبه 10 تیر 1392, 11:50 صبح
سلام ...

یه سرچی که کردم یه دوستی یه کد نوشته بود که بررسی میکرد که برنامه با اجازه Admin اجرا شده یا نه که اگه با اجازه Admin نبود میتونید یه پیام به کاربر بدید که برنامه رو Run as adminstrator کنه :


If My.User.IsInRole(ApplicationServices.BuiltInRole.A dministrator) Then
MsgBox("I have admin privileges")
Else
MsgBox("I do not have admin privileges")
End If


که البته نمیشه 100% به همین اکتفا کرد ...

یه دوست دیگه ای هم کدی به زبان C#‎‎‎‎ نوشته که اونم همین کار رو میکنه : http://www.davidmoore.info/2011/06/20/how-to-check-if-the-current-user-is-an-administrator-even-if-uac-is-on

البته توی فایل app.mainfest هم نوشته شده که چکار کنید برای این کار :



<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.

<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Specifying requestedExecutionLevel node will disable file and registry virtualization.
If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->


که اینجا هم در مورد همین نوشته : http://www.tedlindstrom.se/how-to-grant-your-vb-net-application-administrator-privileges-under-windows-vista-7/

و فکر کنم که اگر کاربر یک بار به برنامه اجازه دسترسی بده کافیه و از اون به بعد برای اجرا تو استارت آپ هم مشکلی نباشه ....

-----------------------------------------------------------------------
فکر میکنم به خاطر اینه که دو تا تالار رو از هم جدا کردن که بچه های وی بی و سی شارپ سایه هم دیگه رو با تیر میزنن :لبخند:


موفق باشید

Slytherin
دوشنبه 10 تیر 1392, 12:50 عصر
امین مستانی عزیز ممنون از شما.
بله تمام این راه حل ها رو توی فروم های خارجی هم دیده بودم ولی هر کدوم مشکلات خودشون رو دارند.
راه حل اولی که سرفا چک میکنه دسترسی ادمین وجود داره یا نه و عملا فقط میشه باهاش اخطار داد که Run As Administrator اجرا کنید و در این حالت برای ما کاربردی نداره...
مجوزی که در mainfest ثبت میشه رو هم قبلا تست کردم، فایده ای نداشت.
در هر صورت من دنبال یک راه هستم که بتونم برنامه ام رو بدون مشکل در استارت آپ ثبت کنم متاسفانه هنوز هیچ راه حلی پیدا نکردم... :|
شما تونستید از طریق تغییر در mainfest این کار رو انجام بدید؟ اگر پاسخ مثبت هست لطفا با VS2010 یا VS2012 یک نمونه کد بذارید.
-----------------------------------------------------------------------
خب هر دوی این لامصبا که تحت دات نت هستند :| چه فرقی با هم دارن... :|

Slytherin
دوشنبه 10 تیر 1392, 15:32 عصر
شاید بنده پرسشم رو صحیح نپرسیدم که دوستان پاسخ نمیدن. پرسش دقیق اینه:
"چطوری میشه برنامه‌هایی که نیاز به پرمیشن ادمین دارن در ویندوز 8 به طور استارت آپ اجرا کرد؟"

Slytherin
دوشنبه 10 تیر 1392, 18:27 عصر
الان که دقت کردم میبینم که این مشکل توی ویندوز 7 هم وجود داره با این تفاوت که اگر توی ویندوز 7 UAC غیر فعال باشه برنامه از استارت آپ اجرا میشه ولی توی ویندوز 8 اگر UAC غیر فعال هم باشه باز اوضاع فرقی نداره...

Slytherin
دوشنبه 10 تیر 1392, 19:20 عصر
ممنون از کمک و راهنمایی همگی!!!!
در نهایت تصمیم گرفتم که UAC رو به طور کامل از طریق کدنویسی غیر فعال کنم و پس از اون به نتیجه رسیدم.
دوستان اگر در آینده به مشکل مشابه برخورد کردند این کد رو توی فرم لود برنامه شون بذارن:

Dim ReadValue As Object = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Policies\System", "EnableLUA", Nothing)
If ReadValue <> 0 Then
My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Policies \System", True).SetValue("EnableLUA", 0, Microsoft.Win32.RegistryValueKind.DWord)
Shell("Shutdown -r -t 0")
End If

mc_laren
سه شنبه 11 تیر 1392, 17:08 عصر
دوست عزیز من برای رفع این مشکل در پروژه های خودم (که با vs.net 2008) نوشتم از این روش استفاده می کنم:
1- روی اسم پروژت از قسمت Solutions Explorer کلیک راست کن و گزینه Properties رو انتخاب کن.
2- به تب Application برو و گزینه View UAC Settings رو انتخاب کن.
3- خط زیر و پیدا کن:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
4- حالا کد زیر رو جایگزین خط بالا کن:
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

امیدوارم مشکل شما هم حل بشه