طريقة للتحقق من حقوق المشرف في السيناريو بيثون تحت ويندوز عبر منصة؟
-
06-07-2019 - |
سؤال
هل هناك أي وسيلة عبر منصة للتأكد من أن بلدي النصي بايثون يتم تنفيذه مع حقوق المشرف؟ للأسف، os.getuid()
هو UNIX فقط وغير متوفر في ويندوز.
المحلول
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
نصائح أخرى
وحاول القيام بكل ما تحتاج حقوق المشرف ل، وتحقق للفشل.
وهذا سوف يعمل فقط لبعض الأمور رغم ذلك، ماذا تحاول أن تفعل؟
ومن الأفضل إذا كنت تحقق من منصة السيناريو الخاص بك يعمل بنظام التشغيل (باستخدام sys.platform
) والقيام اختبار استنادا إلى ذلك، على سبيل المثال، استيراد بعض hasAdminRights وظيفة من آخر، وحدة منصة محددة.
في ويندوز هل يمكن أن تحقق ما إذا كان Windows\System32
غير قابل للكتابة باستخدام os.access
، ولكن تذكر في محاولة لاستعادة مسار المجلد "ويندوز" الفعلي النظام، وربما باستخدام pywin32. لا ترميز ثابت واحد.
وعضوية مجموعة مسؤولي (المجال / المحلي / المؤسسة) هو شيء واحد ..
والخياطة طلبك لعدم استخدام امتياز بطانية ووضع حقوق غرامة الحبيبات هو الخيار الأفضل وخاصة في حالة استخدام التطبيق iinteractively.
واختبار معينة امتيازات المسماة (se_shutdown se_restore الخ)، وحقوق ملف هي abetter الرهان وأسهل للتشخيص.
وهنا وظيفة أداة أنا خلقت من الإجابة المقبولة:
import os
import ctypes
class AdminStateUnknownError(Exception):
"""Cannot determine whether the user is an admin."""
pass
def is_user_admin():
# type: () -> bool
"""Return True if user has admin privileges.
Raises:
AdminStateUnknownError if user privileges cannot be determined.
"""
try:
return os.getuid() == 0
except AttributeError:
pass
try:
return ctypes.windll.shell32.IsUserAnAdmin() == 1
except AttributeError:
raise AdminStateUnknownError