שימוש בפוורשל דינאמי כדי לקבל משתמשים נוכחיים

כשאתה עובד עם Windows, בסופו של דבר תצטרך לדעת אילו חשבונות משתמש מחוברים כרגע למחשב. מקומך מקל כי תוכל להשתמש ב- PowerShell כדי לקבל מידע על המשתמשים הנוכחיים במחשב מקומי או מרוחק.

האם יש לך סיסמאות פגומות ב- Active Directory שלך? גלה זאת באמצעות Specops Password Auditor Free.

במדריך זה, תלמד כמה דרכים להשתמש ב- PowerShell כדי לקבל את המשתמשים הנוכחיים במחשב. השיטות שתלמד כוללות פקודות יישומיות, מחלקות .NET ו- פקודות מסוימות של Windows Management Instrumentation (WMI).

האם אתה מוכן לגלות מי מחביא במחשב שלך? בוא נתחיל!

תנאי קדם

במדריך זה, הכי טוב תלמד על ידי עקומות הדוגמה. וכדי לעשות זאת, תצטרך מחשב שרץ על גרסה מודרנית של Windows, כגון Windows 10, Windows Server 2012 או מאוחר יותר.

במדריך זה ישמש מחשב הרץ על Windows Server 2019 בשם DC1.

למה להשתמש ב- PowerShell כדי לקבל את המשתמשים הנוכחיים המחוברים למחשב?

כניסה למערכת כמשתמש נוכחי על מחשב אכן ניתן לבצע גם בלעדיו של PowerShell. למעשה, מנהלי המערכת היו חייבים להשתמש בדרכים אחרות כבר לפני שהתקנו את PowerShell, נכון? אם כך, למה להשתמש ב-PowerShell?

ביצוע אותה משימה באמצעות PowerShell מועיל מכיוון שניתן לטפל בתוצאות כאובייקטים שניתן לעבוד איתם. לדוגמה, אם אתה מריץ סקריפט שמבקש את פרטי המשתמש, PowerShell יכול למלא אוטומטית את שם המשתמש, ואתה רק צריך להקליד את הסיסמה באופן ידני.

דוגמה נוספת מהחיים האמיתיים היא ייצוא רשימת המשתמשים המחוברים כעת לשרת לקובץ. ניתן להשתמש ב-PowerShell כדי לקבל את המשתמשים הנוכחיים ולייצא את התוצאה לקבצי CSV, HTML או XML. לאחר מכן, תהליכי אוטומציה שונים יכולים להשתמש בפלט זה.

יכול להיות אלפי סיבות להשתמש ב-PowerShell כדי לקבל את המשתמשים הנוכחיים, אך המטרה הסופית תלויה בדרישות שלך. והמדריך הזה ילמד אותך את הדרכים השונות להשיג את המטרה הזו.

שאילתת ה- Win32_ComputerSystem Class

שני ה-cmdlets הטבעיים של PowerShell הנקראים Get-WMIObject ו־Get-CimInstance. מאפשרים לך לשאול מידע, כולל משתמש המחובר כעת, באמצעות כיתות Windows Management Instrumentation (WMI) במחשב מקומי או מרוחק.

Get-WMIObject הוא ה-cmdlet הישן (המופקע) וזמין רק עד ל- Windows PowerShell 5.1. להפך, Get-CIMInstance הוא ה-cmdlet החדש והבטוח יותר וזמין עד ל־גרסאות ה- PowerShell האחרונות.

למידע נוסף, בקר ב־Get-CIMInstance Vs. Get-WMIObject: מה ההבחנה?

על מנת להשתמש ב-PowerShell כדי לקבל את המשתמש הנוכחי, הפעל את ה-cmdlet המתמקד ב-class Win32_ComputerSystem. ה-class Win32_ComputerSystem כולל מגוון מאפיינים, כולל את המאפיין Username. כדי לעשות זאת, פתח חלון PowerShell והרץ את הפקודות למטה.

# באמצעות ה-cmdlet Get-WMIObject והחזר רק את המאפיין Username
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# באמצעות ה-cmdlet Get-CimInstance והחזר רק את המאפיין Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

הערה: שאילתת ה-class Win32_ComputerSystem תחזיר רק את שם המשתמש של מי שמחובר ישירות למחשב (סשן בקונסול). אם המשתמש מחובר מרחוק (לדוג, רחוק דסקטופ), השם משתמש יהיה ריק.

שתי הפקודות מחזירות את אותו התוצאה, כפי שמוצג למטה. אם המשתמש הנוכחי הוא חשבון משתמש בדומיין, הפקודה תחזיר את הדומיין ושם המשתמש (domain\username). אך לחשבון משתמש מקומי, הפלט יהיה מחשב\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 Drive

PowerShell מקבצת משתני סביבה ומפעילה אותם דרך "כונן" בשם "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
# <variable> הוא שם המשתנה שברצונך לקבל
$env:<variable>

בהתבסס על התחביר האמור, הרץ את הפקודה למטה בפוורשל כדי לקבל את המשתמש הנוכחי.

$env:username

כפי שמוצג בתמונה למטה, הפקודה מחזירה את ערך שם המשתמש.

Getting the username variable value

כיתת הסביבה של .NET

פוורשל היא שפת תכנות מונחית עצמים וסביבת פקודות. בעצם, כל מה שאתה עובד עליו בתוך פוורשל הוא אובייקט. כאשר אתה מריץ פקודה, הפלט הוא אובייקט. אם הכרת משתנה, המשתנה הוא אובייקט בעצמו. אתה מבין את הרעיון.

לאובייקטים אלו יש מבנה שמגדיר את סוג הנתונים שהם מייצגים, דומה לתבניות. ותבניות אלו נקראות כיתות .NET או פשוט כיתות.

כדי לקבל את המשתמש הנוכחי ב-PowerShell בקשר למשתני הסביבה, המחלקה הקשורה אליו היא מחלקת Environment. איך ניתן להשתמש במחלקת Environment כדי לקבל את המשתמש הנוכחי ב-PowerShell?

כמו במשתנה $env, יש למחלקת Environment ישות בשם Username, שערכה הוא שם המשתמש הנוכחי. כדי לקבל את ערך המאפיין שם המשתמש, הפעילו את הפקודה למטה ב-PowerShell.

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

בנוסף למאפיין Username, למחלקת Environment יש גם שיטה לקבלת ערך של משתני סביבה. שם השיטה הוא 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). פלט פקודה זה עשוי להיות מועיל אם אתה מתכנן להריץ סקריפט שמביא את זהות המשתמש הנוכחית מעבר לשם המשתמש.

הרץ את הפקודה הבאה בפוורשל כדי לקבל את FQDN ו-UPN של המשתמש הנוכחי.

# Get the current user's FQDN
whoami /fqdn

# Get the current user's 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.

# query מספרים על 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 לקבלת המשתמשים הנוכחיים.

האם יש לך סיסמאות מסוכנות במאגר הנתונים הפעילים שלך? גלה זאת עם Specops Password Auditor Free.

Conclusion

על פי שישנן דרכים רבות ב-PowerShell לקבל את המשתמשים המחוברים כעת, השיטה הטובה ביותר תלויה בהתוצאה שאתה מתכוון לקבל וכיצד אתה מתכוון להשתמש בה.

פקודות ה-cmdlets הקשורות ל-WMI הטבעיות ופקודת ה-query מאפשרות לך לקבל את המשתמשים המחוברים במחשב מקומי או מרחוק. שימוש ב-Class-ים של .NET ובמשתנים של הסביבה מציעים דרכים מהירות לקבלת התוצאות אותן, אך רק על המחשב המקומי.

בין אם אתה מתכוון להפעיל סקריפט או להציג תוצאות במסך באופן ידני, יש שיטה שתתאים לדרישות שלך לשימוש ב-PowerShell לקבלת המשתמש הנוכחי. מה הבא? אולי ללמוד איך ל-פענח תוצאות של פקודת ה-query ולהמיר אותן ל-אובייקטים של PowerShell על ידי כתיבה של פונקציות עם RegEx?

Source:
https://adamtheautomator.com/powershell-get-current-user/