ما هو ويندوز يعادل الأشخاص ذوي الإعاقة. جيتبونام (اسم المستخدم).بو_دير?

StackOverflow https://stackoverflow.com/questions/3305787

  •  26-09-2020
  •  | 
  •  

سؤال

توفر وحدة بيثون للأشخاص ذوي الإعاقة الوصول إلى getpwnam(3) بوسيكس أبي ، والتي يمكن استخدامها للحصول على الدليل الرئيسي لمستخدم معين عن طريق اسم المستخدم ، وكذلك تحديد ما إذا كان اسم المستخدم صالحا على الإطلاق. pwd.getpwnam سيرفع استثناء إذا تم استدعاؤه باسم مستخدم غير موجود.

في البداية يبدو أنه يمكن تحقيق نفس النتيجة بطريقة عبر الأنظمة الأساسية عبر os.path.expanduser('~username').ومع ذلك ، يبدو أنه مع بيثون 2.6 على ويندوز زب هذا لن تنتج في الواقع فشل لاسم مستخدم غير موجود.وعلاوة على ذلك ، على بيثون 2.5 على ويندوز زب ، يبدو أن تفشل حتى بالنسبة للمستخدمين صالحة.

يمكن الحصول على هذه المعلومات بشكل موثوق على ويندوز?كيف?

هل كانت مفيدة؟

المحلول

قراءة 2-6 الوثائق يظهر ذلك os.path.expanduser() مكسورة على النوافذ:

على ويندوز ، المنزل و وسيربروفيل سوف يمكن استخدامها إذا تم تعيينها ، وإلا أ مزيج من هوم باث وهوم درايف سيتم استخدامها.الأولي ~ المستخدم هو التعامل معها عن طريق تجريد الماضي مكون الدليل من الذي تم إنشاؤه مسار المستخدم مشتق أعلاه.

قل وات?يفترض هذا أن جميع منازل المستخدمين يجب أن تكون تحت نفس الدليل الأصل.نوح-هتاف اشمئزاز!

كان من الصعب بعض الشيء لحفر ولكن هنا هو الحل الذي سوف ننظر للمستخدم المحلي بالاسم المعطى:

from win32security import LookupAccountName, ConvertSidToStringSid
from _winreg import OpenKey, QueryValueEx, HKEY_LOCAL_MACHINE

def getUserDir(userName):
    ssid = ConvertSidToStringSid(LookupAccountName(None, userName)[0])
    key = OpenKey(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\\' + ssid)
    return QueryValueEx(key, 'ProfileImagePath')[0]

نصائح أخرى

أنا جديدة على الأمن ويندوز...ولكن قراءة مسن وبعض بلوق يبدو لي أن الطريقة مس تريد منا للتعامل مع المستخدمين الآخرين بيانات محددة هو عن طريق الحصول على رمز المستخدم.

هناك تستخدم ليكون ويكي لطيفة من كيث براون صافي دليل المطورين لأمن ويندوز...لا يزال بإمكانك العثور عليه في ذاكرة التخزين المؤقت جوجل ل "بلورالسيت كيث.دليل"

الحالة 1:إذا لم يكن لديك كلمة مرور المستخدم:

للحسابات المحلية يمكنك محاولة قراءة سجل ويندوز كما ناس بانوف اقترح بالفعل ، وهناك بعض الوصفات الأخرى على سو أو الإنترنت.

لست متأكدا كيف تتصرف إصدارات ويندوز المختلفة لإنشاء المستخدمين حديثا ...تلك التي لم تقم مطلقا بتسجيل الدخول التفاعلي للجلسة...هل يقوم تلقائيا بإنشاء السجل الخاص بهم, المجلد الرئيسي وبيانات الملف الشخصي?لقد فعلت بعض الاختبارات على ويندوز زب وتلك مفاتيح التسجيل لم تكن موجودة بعد إنشاء حساب محلي ...ولكن في هذه الحالة ، يمكنك محاولة تخمينها بناء على جميع قيم تسجيل المستخدمين ...أو تفشل فقط :)

لتطبيقات سطح المكتب ، عندما يتم تشغيل التطبيق كمستخدم تسجيل الدخول ، وأنا باستخدام شيء من هذا القبيل للحصول على المجلد الرئيسي....وللحصول على ما يعادل ~/.المحلية أنا باستخدام سيدل_ أبداتا ، للتجوال الشخصية ، أو مجرد سيدل_ لوكال_ أبداتا.

from win32com.shell import shell, shellcon
# See microsoft references for further CSIDL constants
# http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)

قراءة مقال كيث براون "كيفية الحصول على رمز مميز للمستخدم" ..يمكنك البحث عن بعض الطرق الأخرى للحصول على رمز مستخدم بدون كلمة مرور...

الحالة 2:إذا كان لديك كلمة مرور المستخدم:

قراءة مسن حصلت على إعجاب أنه إذا كان لدي رمز المستخدم ، يمكنني الحصول على مجلداته عن طريق استدعاء شيء مثل التعليمات البرمجية أدناه...لكنها لم تنجح بالنسبة لي.(لست متأكدا لماذا)

token = win32security.LogonUser(
            username,
            None, # we uses UPN format for username
            password,
            win32security.LOGON32_LOGON_NETWORK,
            win32security.LOGON32_PROVIDER_DEFAULT,
            )
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, token, 0)

هذا هو السبب في أنني انتهى مع هذا الرمز...وهو أبعد ما يكون عن الكمال بسبب حقيقة أنه يتطلب اسم المستخدم وكلمة المرور.

token = win32security.LogonUser(
            username,
            None, # Here should be the domain ... or just go with default values
            password,
            win32security.LOGON32_LOGON_NETWORK,
            win32security.LOGON32_PROVIDER_DEFAULT,
            )
win32security.ImpersonateLoggedOnUser(token)
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
win32security.RevertToSelf()

هذا السؤال مرتبط بطريقة ما: كيفية العثور على الدليل الرئيسي للمستخدم الحقيقي باستخدام بايثون?

هل يمكن أن تذهب win32api.GetUserName() (المستخدم الحالي فقط) أو win32net.NetUserGetInfo() (أي مستخدم على أي خادم ، وشملت المضيف المحلي) الطريق.هذا الأخير يمكن أن يكون بطيئا بعض الشيء لأنه يمكن أن يستغرق بعض الوقت للحصول على هذه المعلومات مرة أخرى من نظام التشغيل.

  import win32net

  def userDir(username):
        return win32net.NetUserGetInfo(None, username, 1).get("home_dir")

بدلا من ذلك يمكنك توسيع متغير البيئة USERPROFILE على ويندوز أو HOME على يونكس للحصول على معلومات حول المستخدم الذي قام بتسجيل الدخول حاليا:

  def userDir():
      if os.platform.system() == 'Windows':
          return os.environ['USERPROFILE']
      elif os.platform.system() == 'Linux':
          return os.environ['HOME'] 
      else:
          return None

ويبدو أن هذا ينطبق فقط على المستخدم الحالي ، ولكن على بلدي (ويندوز إكس بي) آلة, os.path.expanduser('~') إرجاع الدليل الرئيسي الخاص بي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top