بعند العمل مع نظام Windows، ستحتاج في بعض الأحيان إلى معرفة الحسابات المستخدمة التي تم تسجيل الدخول باستمرار على الكمبيوتر. لحسن الحظ، يمكنك استخدام PowerShell للحصول على قائمة بالمستخدمين الحاليين سواء على الكمبيوتر المحلي أو على أجهزة الكمبيوتر عن بُعد.
هل لديك كلمات مرور معرضة للخطر في Active Directory الخاص بك؟ اكتشف ذلك باستخدام Specops Password Auditor Free.
في هذا البرنامج التعليمي، ستتعلم العديد من الطرق لاستخدام PowerShell للحصول على المستخدمين الحاليين على الكمبيوتر. ستشمل الطرق التي ستتعلمها الأوامر الأصلية وفصول .NET، وكذلك cmdlets محددة لـ Windows Management Instrumentation (WMI).
هل أنت مستعد لاكتشاف من هم الذين يتسللون إلى جهاز الكمبيوتر الخاص بك؟ لنبدأ!
المتطلبات
في هذا البرنامج التعليمي، ستتعلم بشكل أفضل من خلال اتباع الأمثلة. وللقيام بذلك، ستحتاج إلى كمبيوتر يعمل بإصدار حديث من Windows، مثل Windows 10 أو Windows Server 2012 أو الأحدث.
سيتم استخدام هذا البرنامج التعليمي على كمبيوتر يعمل بنظام Windows Server 2019 بالاسم DC1.
لماذا استخدام PowerShell للحصول على المستخدمين الحاليين المسجلين على الكمبيوتر؟
اعترافًا، هناك طرق لتسجيل مستخدمين حاليين على جهاز الكمبيوتر بدون باور شيل. في النهاية، يجب أن يكون لدى مسؤولي النظام وسيلة للقيام بذلك حتى قبل ظهور باور شيل، أليس كذلك؟ إذا كان الأمر كذلك، لماذا استخدام باور شيل؟
يستفيد القيام بنفس المهمة في باور شيل من معالجة النتائج ككائنات يمكنك التحكم فيها. على سبيل المثال، إذا قمت بتشغيل نص يطلب بيانات اعتماد المستخدم، يمكن لباور شيل ملء اسم المستخدم برمجيًا، ويكفيك فقط كتابة كلمة المرور يدويًا.
مثال آخر في الحياة الواقعية هو تصدير قائمة المستخدمين المسجلين حاليًا على الخادم إلى ملف. وذلك عن طريق استخدام باور شيل للحصول على المستخدمين الحاليين ثم تصدير النتيجة إلى ملف CSV، HTML، أو XML. بعد ذلك، يمكن استخدام هذه النتيجة في تدفقات العمل التلقائي المختلفة.
قد تكون هناك آلاف الأسباب لاستخدام باور شيل للحصول على المستخدمين الحاليين، ولكن الهدف النهائي يعود إلى متطلباتك. وسوف تعلم هذا البرنامج التعليمي الطرق المختلفة لتحقيق هذا الهدف.
الاستعلام عن فئة Win32_ComputerSystem
لنبدأ مع cmdlets الأصلية في PowerShell المسماة Get-WMIObject
و Get-CimInstance
. تتيح لك هذه الأوامر استعلام المعلومات، بما في ذلك المستخدم الذي تم تسجيل الدخول بحاله الحالي، باستخدام فئات إدارة النوافذ (WMI) على كمبيوتر محلي أو عن بُعد.
Get-WMIObject
هو الأمر الأقدم (المهجور) وهو متاح فقط حتى PowerShell 5.1. على الجانب الآخر،Get-CIMInstance
هو الأمر الأحدث والأكثر أمانًا وهو متاح حتى أحدث إصدارات PowerShell.
لمعرفة المزيد، قم بزيارة Get-CIMInstance مقابل Get-WMIObject: ما الفارق؟
لاستخدام PowerShell للحصول على المستخدم الحالي، قم بتنفيذ أمر مستهدفٍ لفئة Win32_ComputerSystem. تتضمن فئة Win32_ComputerSystem خصائص متنوعة، بما في ذلك خاصية Username
. لفعل ذلك، افتح نافذة PowerShell وقم بتشغيل الأوامر التالية.
ملاحظة: سيقوم استعلام فئة Win32_ComputerSystem بإرجاع اسم المستخدم الذي يكون مسجلاً على الحاسوب مباشرةً (جلسة وحدة التحكم). إذا كان المستخدم قد قام بتسجيل الدخول عن بُعد (على سبيل المثال، Remote Desktop)، ستكون قيمة اسم المستخدم فارغة.
كلا الأوامر ترجع نفس النتيجة، كما هو موضح أدناه. إذا كان المستخدم الحالي حساب مستخدم في النطاق، سيقوم الأمر بإرجاع اسم النطاق واسم المستخدم (domain\username
). ولكن بالنسبة لحساب المستخدم المحلي، ستكون النتيجة computer\username
.

Get-WMIObject
وGet-CimInstance
لديهما معلمة تسمى-computerName
، التي تقبل اسم الكمبيوتر الذي يتم استعلامه. باستخدام هذه المعلمة ، يمكنك استعلام نفس المعلومات من جهاز عن بعد في الشبكة.
ولكن إذا كنت بحاجة إلى الحصول على اسم المستخدم فقط دون النطاق ، يمكن حلاً عن طريق تقسيم الناتج باستخدام طريقة split()
. للقيام بذلك ، قم بتشغيل الأمر أدناه في PowerShell.
ونتيجة لذلك ، يقوم PowerShell بإرجاع جزء المستخدم فقط ، كما هو موضح في الصورة أدناه.

قراءة متغيرات بيئة Windows
طريقة أخرى لاستخدام PowerShell للحصول على المستخدم الحالي على جهاز الكمبيوتر هي عن طريق استرجاع القيم من متغيرات البيئة. تمثل متغيرات البيئة بيانات نظام التشغيل، بما في ذلك اسم المستخدم الحالي، بين أمور أخرى.
هناك ثلاث طرق للتفاعل مع متغيرات البيئة. أي الطريقة التي تختارها سترجع نفس النتيجة.
محرك الـ Env PowerShell
يخزن PowerShell متغيرات البيئة ويجعلها متاحة من خلال محرك PowerShell (PSDrive) يُسمى محرك Env:
. PSDrives هي مواقع بيانات يمكنك الوصول إليها مثل محرك على الكمبيوتر (على سبيل المثال، C:)، ولكنها قابلة للوصول فقط داخل PowerShell.
ينشئ PowerShell تلقائيًا محرك الـ Env:
بمجرد فتح جلسة PowerShell. ونظرًا لأن Env:
هو محرك، يمكنك الحصول على محتوياته عن طريق استدعاء cmdlet Get-ChildItem
، على غرار كيفية سرد محتويات محرك أو مجلد في نظام الملفات.
استخدام محرك Env: في PowerShell، احصل على المستخدم الحالي من خلال تشغيل الأمر أدناه.
تظهر اللقطة الشاشية أدناه النتيجة المتوقعة. كما يمكنك أن ترى، يعيد الأمر العنصر USERNAME
وقيمته المقابلة، والتي هي المستخدم الحالي المسجل الدخول.

للعودة إلى قيمة اسم المستخدم فقط، قم بتعديل الأمر كما تراه أدناه وأعد تشغيله في PowerShell.
وكما ترى أدناه، يعيد الأمر فقط قيمة اسم المستخدم كسلسلة نصية.

المتغير $env
بجانب الوصول إلى متغيرات البيئة كمحرك أقراص PSDrive والتعامل معها كملفات في محرك، طريقة أخرى للوصول هي الوصول إلى محرك Env كمتغير. وهذا يعني أنه يمكنك الإشارة إلى متغيرات البيئة باستخدام الصيغة التالية.
بناءً على البنية النحوية المذكورة، قم بتشغيل الأمر أدناه في PowerShell للحصول على المستخدم الحالي.
كما يظهر في اللقطة الشاشة أدناه، يعيد الأمر قيمة اسم المستخدم.

فئة البيئة .NET
PowerShell هي لغة موجهة للكائنات والقشرة. ببساطة، كل ما تعمل عليه داخل PowerShell هو كائن. عند تشغيل أمر، يكون الإخراج كائنًا. إذا قمت بتعريف متغير، فإن هذا المتغير هو كائن بحد ذاته. أنت تفهم الفكرة.
هذه الكائنات لها هيكل يحدد نوع البيانات التي تمثلها، مشابهة للمخططات. وتسمى هذه المخططات .NET classes أو ببساطة فئات.
بالنسبة لمتغيرات البيئة، الصنف المرتبط بها هو صنف Environment. فكيف تستخدم صنف Environment في PowerShell للحصول على المستخدم الحالي؟
مثل المتغير $env، يحتوي صنف البيئة على خاصية Username
، الذي يكون قيمته اسم المستخدم الحالي. للحصول على قيمة خاصية اسم المستخدم، قم بتشغيل الأمر التالي في PowerShell.

بالإضافة إلى خاصية الـ Username
، يحتوي صنف البيئة أيضًا على طريقة للحصول على قيمة متغير البيئة. اسم الطريقة هو GetEnvironmentVariable
.
للحصول على المستخدم الحالي باستخدام هذه الطريقة، قم بتشغيل الأمر التالي.

استخدام صنف .NET WindowsIdentity
فئة WindowsIdentity هي فئة أخرى في .NET يمكنك استدعاؤها في PowerShell للحصول على المستخدم الحالي. تحتوي هذه الفئة على طريقة تسمى GetCurrentName
، التي تُرجع كائنًا يُمثل المستخدم الحالي لنظام التشغيل Windows.
للحصول على تفاصيل المستخدم الحالي، قم بتشغيل الأمر أدناه.
كما يمكنك رؤية أدناه، يُرجع الأمر الحالي خصائص كائن المستخدم الحالي، بما في ذلك خاصية Name
. قيمة خاصية Name
تتبع تقليم domain\user
.

للحصول على جزء اسم المستخدم فقط، قم بتعديل الأمر السابق لتحديد الخاصية Name
فقط، وتطبيق تقنية تقسيم السلسلة. للقيام بذلك، انسخ الأمر أدناه وقم بتشغيله في PowerShell.

باستخدام أمر whoami
آخر أمر مفيد يتيح لك بسرعة الحصول على المستخدم الحالي هو أمر whoami
. هذا الأمر هو ملف قابل للتنفيذ يمكنك العثور عليه في مجلد %WINDIR%\System32 باسم الملف whoami.exe
.
للحصول على اسم المستخدم الحالي، قم بتشغيل الأمر أدناه.
يُرجع الأمر بعد ذلك النتيجة بتنسيق domain username
، مثلما يظهر في اللقطة المرفقة.

للحصول على اسم المستخدم بدون النطاق، قم بتطبيق تقنية تقسيم النص التي تعلمتها سابقًا في هذا البرنامج التعليمي عن طريق تشغيل الأمر التالي.

يمكن أيضًا أن يعيد الأمر whoami
اسم المستخدم الكامل المؤهل (FQDN) البارز الحالي واسم المستخدم الأساسي (UPN). يمكن أن يكون إخراج هذا الأمر مفيدًا إذا كنت تنوي تشغيل نص يسترد هوية المستخدم الحالي بخلاف اسم المستخدم.
قم بتشغيل الأمر التالي في PowerShell للحصول على FQDN و UPN للمستخدم الحالي.

ملاحظة: قيم FQDN و UPN متاحة فقط إذا كان المستخدم المسجل حاليًا مستخدم نطاق. إذا حاولت الحصول على هذه القيم لمستخدم محلي، ستعيد الأمر خطأً كما هو موضح أدناه.

استخدام أمر query
إذا كنت مسؤول نظام أو مستخدم نطاق، فمن المحتمل أنك قد قمت بتسجيل الدخول إلى جهاز بعيد عبر بروتوكول سطح المكتب البعيد (RDP) على الأقل مرة واحدة، ربما لإدارة الموارد أو استخدام التطبيقات. بغض النظر عن السبب، سترغب في معرفة من هو المستخدم الحالي الذي يقوم بتسجيل الدخول واستخدام موارد النظام.
لحسن الحظ، يحتوي نظام Windows على أداة سطر الأوامر المدمجة تسمى query
التي يمكنها عرض جميع المستخدمين المسجلين حاليًا على الكمبيوتر. تُظهر الأمر أيضًا ما إذا كان المستخدم قد سجّل الدخول عبر جلسة سطح مكتب بعيدة أم محليًا إلى الكمبيوتر.
يحتوي الأمر query
على معلمتين ذات صلة بالحصول على المستخدمين المسجلين الحاليين؛ session
و user
. تقوم المعلمة session
بسرد جلسات الكمبيوتر، بينما تقوم المعلمة user
بسرد المستخدمين وجلساتهم.
يحتوي أمر
query session
على اسم مستعار يُعرف باسمqwinsta
، بينما يكون الاسم المستعار لأمرquery user
هوquser
.
على سبيل المثال، قم بتشغيل الأمر أدناه لعرض الجلسات على DC1.
الصورة أدناه تظهر إخراج الأمر. في هذا المثال، قام مستخدمان بتسجيل الدخول إلى جهاز الكمبيوتر DC1 – أحدهما في جلسة الوحدة والآخر عبر RDP. كما هو واضح، يُعيد qwinsta
جميع الجلسات، حتى تلك التي ليست للمستخدمين.

إذا قمت بتشغيل
qwinsta
أوquser
بمفردهما بدون وجود الوسم/server:<computer>
، فإما الأمر سيستعلم الكمبيوتر المحلي افتراضيًا.
بعد ذلك، لعرض جميع المستخدمين الذين لديهم جلسات تسجيل دخول قائمة، قم بتشغيل الأمر user
أدناه.
بعد تشغيل الأمر، ستلاحظ فورًا أن quser
يُعيد الجلسات والمستخدمين مثل أمر qwinsta
. ولكن في هذا الوقت، لا توجد جلسات فارغة.
هناك أيضًا عمودين إضافيين: IDLE TIME
، الذي يظهر وقت الخمول للمستخدمين، وLOGON TIME
الذي يظهر الطابع الزمني لتسجيل الدخول للمستخدمين.

في النهاية، عند مقارنة نتائج qwinsta
و quser
، يُعتبر quser
هو الأمر الأكثر ملاءمة في PowerShell للحصول على المستخدمين الحاليين.
هل لديك كلمات مرور تم التلاعب بها في Active Directory؟ اكتشف ذلك باستخدام Specops Password Auditor Free.
الختام
بينما هناك العديد من الطرق في PowerShell للحصول على المستخدمين الحاليين المسجلين، يعتمد أفضل طريقة على النتيجة التي تنوي الحصول عليها وكيفية استخدامها.
تسمح لك أوامر cmdlets المتعلقة بـ WMI وأمر query
بالحصول على المستخدمين المسجلين على جهاز كمبيوتر محلي أو عن بُعد. باستخدام فئات .NET والمتغيرات البيئية، تتيح لك طرق سريعة لاسترجاع نفس النتائج ولكن فقط على الكمبيوتر المحلي.
سواء كنت تخطط لتشغيل سكريبت أو عرض النتائج يدويًا على الشاشة، هناك طريقة تلبي متطلباتك لاستخدام PowerShell للحصول على المستخدم الحالي. ماذا بعد؟ ربما تعلم كيفية تحليل نتائج أمر الاستعلام وتحويلها إلى كائنات PowerShell من خلال كتابة وظائف باستخدام RegEx؟
Source:
https://adamtheautomator.com/powershell-get-current-user/