PDA

View Full Version : سوال: سوال :کاربر جاری ادمین هست؟



mazaher5723
یک شنبه 07 خرداد 1391, 12:18 عصر
ایا کاربر جاری ادمین هست؟
درست اجار نمیشه چه ادمین باشه چه نه میزنه false
بنظرتون مشکل از کجاهه
using System.Security.Principal;
...
bool IsAnAdministrator ()
{
WindowsIdentity identity =
WindowsIdentity.GetCurrent();
WindowsPrincipal principal =
new WindowsPrincipal (identity);
return principal.IsInRole
(WindowsBuiltInRole.Administrator);
}

Saeed_m_Farid
یک شنبه 07 خرداد 1391, 12:57 عصر
مشکل از اینجاهه که شما فقط داری به Administrator که Built-in هست نگاه میکنی و فقط وقتی true میگیری که با نام کاربری Administrator وارد شده باشی، نه کاربری که دارای privilege مربوط به Admin ها باشه ...
شما باید تمام (تا اونجایی که سوادمون قد میده!) گروه های Admin رو برای کاربر موردنظر بگردید:

/// <summary>
/// Determine if the current instanse of application/service
/// running as an administrator or not?
/// </summary>
/// <returns>
/// True if current user running as an administrator
/// </returns>
public static bool IsRunningAsLocalAdmin()
{
try
{
WindowsIdentity cur = WindowsIdentity.GetCurrent();

WindowsPrincipal principal = new WindowsPrincipal(cur);
foreach (IdentityReference role in cur.Groups)
if (role.IsValidTargetType(typeof(SecurityIdentifier) ))
{
SecurityIdentifier sid = (SecurityIdentifier)role.Translate(typeof(Security Identifier));
if (sid.IsWellKnown(WellKnownSidType.AccountAdministr atorSid) || sid.IsWellKnown(WellKnownSidType.BuiltinAdministra torsSid))
return true;
}
return false;
}
catch (Exception ex)
{
LogError(ex.Message);
throw;
}
}

mazaher5723
یک شنبه 07 خرداد 1391, 14:57 عصر
مرسی
ممنونم از لططقتنون

mazaher5723
یک شنبه 07 خرداد 1391, 15:07 عصر
اینم کار نکررررررررررررررررررررررر ررررررد

Saeed_m_Farid
دوشنبه 08 خرداد 1391, 22:27 عصر
اینم کار نکررررررررررررررررررررررر ررررررد
باید بشه! این دستور رو تو cmd بزن ببین اصلاً user ات admin هست یا نه؟

net localgroup Administrators

mazaher5723
دوشنبه 08 خرداد 1391, 22:33 عصر
اره ادمین هست
جواب داد میگه ادمینه

Saeed_m_Farid
سه شنبه 09 خرداد 1391, 19:22 عصر
نمیدونم مشکل دوستمون حل شد یا نه، ولی ممکنه حل هم نشه با این کد! چون اینم فقط تو AccountAdministratorSid و BuiltinAdministratorsSid نگاه میکنه و ممکنه 100 نوع گروه Admin باشه که بین کاربر تو یکی از اونا باشه و تو اینها نباشه و با این کد یررسی نشن ...


به این صورت به کار ببرید ...
خیلی ممنون، ولی فقط محض راهنمایی، فرق "به این صورت" با اونیکه من نوشتم:


یه flag گذاشتین که عملاً فقط راندمان کار رو میاره پایین، چون تو اون کد، با اولین موردی که صدق کنه از حلقه میاد بیرون ولی تو این تا آخرش میره... (فکر کنم تو درس طراحی الگوریتم در موردش خونده بودیم نه؟)
این مهمتره و خطرناکتر! شما تو catch اصطلاحاً تمام Exception ها رو خوردین، فقط مواظب باشین mehdi.mousavi (http://barnamenevis.org/member.php?41233-mehdi.mousavi) نبینه والا فکر کنم گوشاتون رو میبره میذاره کف دستتون، خین میاد :لبخند: یه بار میخواست منو اعدام کنه ...
من یه تابع دارم LogError همیشه اونو برای مدیریت خطاها و اطلاع رسانی و ... استفاده میکنم، یادم میره از کدهایی که میذارم برشون دارم؛ مرسی که اون رو تصحیح کردین. بازم اونم از راهنمایی های جناب mehdi.mousavi (http://barnamenevis.org/member.php?41233-mehdi.mousavi) برام مونده؛ یه زمانی من بلد نبودم logging اینهمه تو #C انعطاف پذیره، هزار تا بامبول در میاوردم؛ بعداً یه جناب موسوی بار کدهام رو دید، این ذهنیت رو کاشت و از اون به بعد من از System.Diagnostics.TraceSource استفاده کردم که حتماً در مورد قابلیت هاش به زودی یه مطلب می نویسم، چقدر هم که نویسنده ام ...

Saeed_m_Farid
چهارشنبه 10 خرداد 1391, 08:53 صبح
اره ادمین هست
جواب داد میگه ادمینه

اگه میگه ادمینه! پس ما هم تقلب می کنیم به جواب همون نگاه می کنیم؛ اگه بگین کار نکرد، دیگه باید username که دارین (با یه breakpoint بعد خط username = ... ) و نتیجه net localgroup Administrators رو هم اینجا بذارید تا ببینم مشکل از کجاست :


/// <summary>
/// Determine if the current instanse of application/service
/// running as an administrator or not?
/// </summary>
/// <returns>
/// True if current user running as an administrator
/// </returns>
/// <remarks>
/// This is a made-up method that parse command line for current user
/// </remarks>
public static bool IsAdmin_fakery()
{
Process p = new Process();
string userName = System.Security.Principal.WindowsIdentity.GetCurre nt().Name;
if (userName.IndexOf('\\') >= 0)
userName = userName.Split(new char[] { '\\' }).Last();

p.StartInfo = new ProcessStartInfo("cmd", "/c \"net localgroup Administrators")
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
return output.Contains(userName);
}