PDA

View Full Version : سوال: اجازه Admin



regbyte
سه شنبه 01 مرداد 1387, 21:56 عصر
یه برنامه نوشتم که برای اجرا نیاز به Administrator User داره.
(البته در Windows XP)
1. چطوری می تونم چک کنم که کاربر جاری Admin است یا نه؟
2. اگر Admin نبود چطوری برنامه رو تحت Admin اجرا کنم؟

CodeProject: RunAs Class. Free source code and programming help (http://www.codeproject.com/KB/cs/runas.aspx) رو هم دیدم، اما دنبال یه راه بهتر می گردم، که از فرم خود ویندوز استفاده کنه.(کاربران Admin رو لیست کنه و ...)

لطفا راهنمایی کنید.

DarkSoroush
چهارشنبه 02 مرداد 1387, 00:45 صبح
برای اطلاع پیدا کردن از اینکه یوزر ادمین هست یا نه میتونی از IsNTAdmin که یک مقدار true و false برمیگردونه استفاده کنی. این Api داخل advpack.dll تعریف شده.


در مورد یک پنجره که خودش کاربران ادمین رو ذکر کرده باشه فکر کنم دستور Run as ویندوز جالب باشه. کافیه فقط خاصیت verb کلاس process خودتون رو به Runas ست کنید تا این صفحه دیده بشه.

regbyte
چهارشنبه 02 مرداد 1387, 10:02 صبح
آیا راهی بجر استفاده از API نیست؟

سار
چهارشنبه 02 مرداد 1387, 12:44 عصر
این برای حالتی هست که داری از کاربرهای خود ویندوز استفاده می کنی. و دسترسی کاربر جاری رو برسی میکنه.


AppDomain.CurrentDomain.SetPrincipalPolicy(System. Security.Principal.PrincipalPolicy.WindowsPrincipa l);
System.Security.Principal.WindowsPrincipal p = (System.Security.Principal.WindowsPrincipal)Thread .CurrentPrincipal;
MessageBox.Show(p.IsInRole(System.Security.Princip al.WindowsBuiltInRole.Administrator));

regbyte
چهارشنبه 02 مرداد 1387, 15:15 عصر
System.Security.Principal.WindowsPrincipal x = new System.Security.Principal.WindowsPrincipal(System. Security.Principal.WindowsIdentity.GetCurrent());
MessageBox.Show(x.IsInRole(System.Security.Princip al.WindowsBuiltInRole.Administrator).ToString());

کدوم کد رو استفاده کنم؟

regbyte
چهارشنبه 02 مرداد 1387, 16:35 عصر
وقتی در یک Account که Admin نیست، یه دستگاه جدید بصورت Plug and Play شناسایی بشه، برای نصب نیاز به Admin User داره و پنجره زیر رو نمایش می ده:

http://barnamenevis.org/forum/attachment.php?attachmentid=20850&stc=1&d=1216816706

و اگر روی یک فایل Right Click کرده و Run As رو انتخاب کنیم، پنجره زیر رو نمایش می ده:

http://barnamenevis.org/forum/attachment.php?attachmentid=20849&stc=1&d=1216816703

چطور می تونم برای اجرای برنامه تحت Admin یکی از این پنجره ها رو نمایش بدم؟
البته در Windows XP

لطفا راهنمایی کنید.

DarkSoroush
چهارشنبه 02 مرداد 1387, 19:05 عصر
وقتی در یک Account که Admin نیست، یه دستگاه جدید بصورت Plug and Play شناسایی بشه، برای نصب نیاز به Admin User داره و پنجره زیر رو نمایش می ده:

http://barnamenevis.org/forum/attachment.php?attachmentid=20850&stc=1&d=1216816706

و اگر روی یک فایل Right Click کرده و Run As رو انتخاب کنیم، پنجره زیر رو نمایش می ده:

http://barnamenevis.org/forum/attachment.php?attachmentid=20849&stc=1&d=1216816703

چطور می تونم برای اجرای برنامه تحت Admin یکی از این پنجره ها رو نمایش بدم؟
البته در Windows XP

لطفا راهنمایی کنید.
َما پست منو مطالعه نکردی؟!
من متذکر شدم برای نمایش فرم Run as میتونید با استفاده از کلاس پروسس و ست کردن مشخصه Verb این کلاس برنامه دیگری را به این صورت اجرا کنید. البته در این صورت به دو تا برنامه نیاز دارید. یکی خود نرمافزار و دیگری نرمافزاری که ادمین بودن را تعیین و فایل اصلی را اجرا کنه.

regbyte
چهارشنبه 02 مرداد 1387, 19:30 عصر
با تشکر

اما همانطور که خودتان اشاره کردید، من می خوام این کار رو در خود نرم افزارم انجام بدم.

DarkSoroush
چهارشنبه 02 مرداد 1387, 20:03 عصر
خب طبیعتا نرمافزاری که اجرا شده نمیتونه یوزر خودش رو تغییر بده مگر برنامه شما بعد از اجرا, مجددا یک پروسس دیگه از خودش ایجاد کنه و kill بشه!!

regbyte
چهارشنبه 02 مرداد 1387, 20:34 عصر
خیر؛ اینطور نیست، من تو برنامم دارم اینکار رو می کنم؛ اما فرم Login مجدد رو خودم دوباره ساختم،
شما ظاهرا اولین پست رو مطالعه نکردین:
CodeProject: RunAs Class. Free source code and programming help (http://www.codeproject.com/KB/cs/runas.aspx)
این هم یه نمونه فرم Login :



using System.Security.Principal;
using System.Runtime.InteropServices;
//DLL
public class FormAdminLogin
{
private const int LOGON_TYPE_INTERACTIVE = 2;
private const int LOGON_TYPE_PROVIDER_DEFAULT = 0;
// Using this api to get an accessToken of specific Windows User by its user name and password
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool LogonUser(string userName, string domain, string passWord, int logonType, int logonProvider, ref IntPtr accessToken);

private void btnLogin_Click(object sender, System.EventArgs e)
{
isAdmin = false;
IntPtr accessToken = IntPtr.Zero;
if (LogonUser(txtUserName.Text, "", txtPassword.Text, LOGON_TYPE_INTERACTIVE, LOGON_TYPE_PROVIDER_DEFAULT, accessToken)) {

// using the token to create an instance of WindwosIdentity class
WindowsIdentity identity = new WindowsIdentity(accessToken);

WindowsImpersonationContext context = identity.Impersonate();

try {
WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
if (wp.IsInRole(WindowsBuiltInRole.Administrator) == true) {
isAdmin = true;
this.Close();
}
else {
isAdmin = false;
MessageBox.Show(txtUserName.Text + " " + "isn't an Administrator user.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
txtUserName.Text = "Administrator";
txtPassword.Text = "";
//End
}
}
catch {
isAdmin = false;
}
}
else {
MessageBox.Show("Username or password is not correct.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}




من می خوام از فرم Login خود Windows استفاده کنم.

DarkSoroush
چهارشنبه 02 مرداد 1387, 21:28 عصر
خیر؛ اینطور نیست، من تو برنامم دارم اینکار رو می کنم؛ اما فرم Login مجدد رو خودم دوباره ساختم،
شما ظاهرا اولین پست رو مطالعه نکردین:
CodeProject: RunAs Class. Free source code and programming help (http://www.codeproject.com/KB/cs/runas.aspx)
این هم یه نمونه فرم Login :



using System.Security.Principal;
using System.Runtime.InteropServices;
//DLL
public class FormAdminLogin
{
private const int LOGON_TYPE_INTERACTIVE = 2;
private const int LOGON_TYPE_PROVIDER_DEFAULT = 0;
// Using this api to get an accessToken of specific Windows User by its user name and password
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool LogonUser(string userName, string domain, string passWord, int logonType, int logonProvider, ref IntPtr accessToken);

private void btnLogin_Click(object sender, System.EventArgs e)
{
isAdmin = false;
IntPtr accessToken = IntPtr.Zero;
if (LogonUser(txtUserName.Text, "", txtPassword.Text, LOGON_TYPE_INTERACTIVE, LOGON_TYPE_PROVIDER_DEFAULT, accessToken)) {

// using the token to create an instance of WindwosIdentity class
WindowsIdentity identity = new WindowsIdentity(accessToken);

WindowsImpersonationContext context = identity.Impersonate();

try {
WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
if (wp.IsInRole(WindowsBuiltInRole.Administrator) == true) {
isAdmin = true;
this.Close();
}
else {
isAdmin = false;
MessageBox.Show(txtUserName.Text + " " + "isn't an Administrator user.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
txtUserName.Text = "Administrator";
txtPassword.Text = "";
//End
}
}
catch {
isAdmin = false;
}
}
else {
MessageBox.Show("Username or password is not correct.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}

من می خوام از فرم Login خود Windows استفاده کنم.
من پست اول شما رو مطالعه کردم. این کد رو هم دیدیم!! ولی هیچ جای حرف من مخالف با این نیست!! :متفکر:
CodeProject: RunAs Class. Free source code and programming help (http://www.codeproject.com/KB/cs/runas.aspx) که فقط با استفاده از کلاس پروسس و یوزر و نیم و پسورد یوزر برنامه رو اجرا میکنه که منم اشاره کردم شما میتونید بعد از اجرای برنامه مدیر را پیدا کنید و خودتون مجددا برنامه رو تحت اون یوزر اجرا کنید. حال اینکه از run as یا از کلاس پروسس استفاده کنید فرقی نداره.

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

اگر منظور منو متوجه نمیشید کمی فرصت بدهید تا یک نمونه کد بزام.
---------------------------------------------
ویرایش
سعی کردم با توجه به همون اطلاعاتی که شما و "سار" نوشته بودند این نمونه رو بنویسم. تست نکردم چون الان یوزر با سطح دسترسی پایین تر روی سیستم ندارم ولی اگه کار نکرد اطلاع بدید ممنون میشم.!! :چشمک: