استخدام PowerShell الديناميكي للحصول على المستخدمين الحاليين

بعند العمل مع نظام 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 وقم بتشغيل الأوامر التالية.

# باستخدام cmdlet Get-WMIObject وإرجاع خاصية Username فقط
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# باستخدام cmdlet Get-CimInstance وإرجاع خاصية Username فقط
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

ملاحظة: سيقوم استعلام فئة Win32_ComputerSystem بإرجاع اسم المستخدم الذي يكون مسجلاً على الحاسوب مباشرةً (جلسة وحدة التحكم). إذا كان المستخدم قد قام بتسجيل الدخول عن بُعد (على سبيل المثال، Remote Desktop)، ستكون قيمة اسم المستخدم فارغة.

كلا الأوامر ترجع نفس النتيجة، كما هو موضح أدناه. إذا كان المستخدم الحالي حساب مستخدم في النطاق، سيقوم الأمر بإرجاع اسم النطاق واسم المستخدم (domain\username). ولكن بالنسبة لحساب المستخدم المحلي، ستكون النتيجة computer\username.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject و Get-CimInstance لديهما معلمة تسمى -computerName ، التي تقبل اسم الكمبيوتر الذي يتم استعلامه. باستخدام هذه المعلمة ، يمكنك استعلام نفس المعلومات من جهاز عن بعد في الشبكة.

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

# الأمر أدناه سيقسم خاصية اسم المستخدم إلى قسمين باستخدام الشرطة الخلفية '\' كفاصل.
# الجزء [1] في النهاية يخبر الأمر بإرجاع النتيجة فقط في الموقع 1.
# تبدأ الفهارس بالرقم 0 ، وهذا يعني أن تحديد الفهرس 1 سيعرض النتيجة في الموقع الثاني.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

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

Splitting the username property

قراءة متغيرات بيئة Windows

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

هناك ثلاث طرق للتفاعل مع متغيرات البيئة. أي الطريقة التي تختارها سترجع نفس النتيجة.

محرك الـ Env PowerShell

يخزن PowerShell متغيرات البيئة ويجعلها متاحة من خلال محرك PowerShell (PSDrive) يُسمى محرك Env:. PSDrives هي مواقع بيانات يمكنك الوصول إليها مثل محرك على الكمبيوتر (على سبيل المثال، C:)، ولكنها قابلة للوصول فقط داخل PowerShell.

ينشئ PowerShell تلقائيًا محرك الـ Env: بمجرد فتح جلسة PowerShell. ونظرًا لأن Env: هو محرك، يمكنك الحصول على محتوياته عن طريق استدعاء cmdlet Get-ChildItem، على غرار كيفية سرد محتويات محرك أو مجلد في نظام الملفات.

استخدام محرك Env: في PowerShell، احصل على المستخدم الحالي من خلال تشغيل الأمر أدناه.

Get-ChildItem Env:\USERNAME

تظهر اللقطة الشاشية أدناه النتيجة المتوقعة. كما يمكنك أن ترى، يعيد الأمر العنصر USERNAME وقيمته المقابلة، والتي هي المستخدم الحالي المسجل الدخول.

Getting the Env:\USERNAME item

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

(Get-ChildItem Env:\USERNAME).Value

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

Getting the Env:\USERNAME value

المتغير $env

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

# يشير علامة $ إلى متغير
# env هو محرك Env
# <متغير> هو اسم المتغير الذي تريد الحصول عليه
$env:<variable>

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

$env:username

كما يظهر في اللقطة الشاشة أدناه، يعيد الأمر قيمة اسم المستخدم.

Getting the username variable value

فئة البيئة .NET

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

هذه الكائنات لها هيكل يحدد نوع البيانات التي تمثلها، مشابهة للمخططات. وتسمى هذه المخططات .NET classes أو ببساطة فئات.

بالنسبة لمتغيرات البيئة، الصنف المرتبط بها هو صنف Environment. فكيف تستخدم صنف Environment في PowerShell للحصول على المستخدم الحالي؟

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

[System.Environment]::UserName
Getting the environment username property value

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

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

[System.Environment]::GetEnvironmentVariable('username')
Getting the environment variable value

استخدام صنف .NET WindowsIdentity

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

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

[System.Security.Principal.WindowsIdentity]::GetCurrent()

كما يمكنك رؤية أدناه، يُرجع الأمر الحالي خصائص كائن المستخدم الحالي، بما في ذلك خاصية Name. قيمة خاصية Name تتبع تقليم domain\user.

Getting the current Windows user

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

([System.Security.Principal.WindowsIdentity]::GetCurrent().Name).Split('\')[1]
Returning only the username part

باستخدام أمر whoami

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

للحصول على اسم المستخدم الحالي، قم بتشغيل الأمر أدناه.

whoami

يُرجع الأمر بعد ذلك النتيجة بتنسيق domain username، مثلما يظهر في اللقطة المرفقة.

Getting the username using whoami

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

(whoami).Split('\')[1]
Getting the username without the domain

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

قم بتشغيل الأمر التالي في PowerShell للحصول على FQDN و UPN للمستخدم الحالي.

# احصل على FQDN للمستخدم الحالي
whoami /fqdn

# احصل على UPN للمستخدم الحالي
whoami /upn
Getting the current user’s FQDN and UPN

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

Error getting the UPN and FQDN of a non-domain user account

استخدام أمر query

إذا كنت مسؤول نظام أو مستخدم نطاق، فمن المحتمل أنك قد قمت بتسجيل الدخول إلى جهاز بعيد عبر بروتوكول سطح المكتب البعيد (RDP) على الأقل مرة واحدة، ربما لإدارة الموارد أو استخدام التطبيقات. بغض النظر عن السبب، سترغب في معرفة من هو المستخدم الحالي الذي يقوم بتسجيل الدخول واستخدام موارد النظام.

لحسن الحظ، يحتوي نظام Windows على أداة سطر الأوامر المدمجة تسمى query التي يمكنها عرض جميع المستخدمين المسجلين حاليًا على الكمبيوتر. تُظهر الأمر أيضًا ما إذا كان المستخدم قد سجّل الدخول عبر جلسة سطح مكتب بعيدة أم محليًا إلى الكمبيوتر.

يحتوي الأمر query على معلمتين ذات صلة بالحصول على المستخدمين المسجلين الحاليين؛ session و user. تقوم المعلمة session بسرد جلسات الكمبيوتر، بينما تقوم المعلمة user بسرد المستخدمين وجلساتهم.

يحتوي أمر query session على اسم مستعار يُعرف باسم qwinsta، بينما يكون الاسم المستعار لأمر query user هو quser.

على سبيل المثال، قم بتشغيل الأمر أدناه لعرض الجلسات على DC1.

# استعراض الجلسات على DC1
qwinsta /server:dc1

الصورة أدناه تظهر إخراج الأمر. في هذا المثال، قام مستخدمان بتسجيل الدخول إلى جهاز الكمبيوتر DC1 – أحدهما في جلسة الوحدة والآخر عبر RDP. كما هو واضح، يُعيد qwinsta جميع الجلسات، حتى تلك التي ليست للمستخدمين.

Querying sessions

إذا قمت بتشغيل qwinsta أو quser بمفردهما بدون وجود الوسم /server:<computer>، فإما الأمر سيستعلم الكمبيوتر المحلي افتراضيًا.

بعد ذلك، لعرض جميع المستخدمين الذين لديهم جلسات تسجيل دخول قائمة، قم بتشغيل الأمر user أدناه.

# استعلام المستخدمين على DC1
quser /server:dc1

بعد تشغيل الأمر، ستلاحظ فورًا أن quser يُعيد الجلسات والمستخدمين مثل أمر qwinsta. ولكن في هذا الوقت، لا توجد جلسات فارغة.

هناك أيضًا عمودين إضافيين: IDLE TIME، الذي يظهر وقت الخمول للمستخدمين، وLOGON TIME الذي يظهر الطابع الزمني لتسجيل الدخول للمستخدمين.

Querying users

في النهاية، عند مقارنة نتائج 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/