27/11/2021

חלק 10 - הרצת פקודות על מחשבים מרוחקים בעזרת (Invoke-Command) - Implicit Remoting



חלק 10 - עבודה על מחשבים מרוחקים עם בעזרת הפקודה Invoke-command

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

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

ברגע שמפעילים את ה Remoting מאחורי הקלעים קוראים הדברים הבאים:
  1. הסרוויס - WinRm מתחיל לפעול, ונהיה על מצב אוט'
  2. חומת האש של ווינדוס (אם יש לכם חומת אש חיצונית, תצטרכו לעשות את זה ידנית) תיצור חוק (Rгle) רגיל ל WsMan (מוזמנים לחפש ברשת מה זה) - ההתחברות עם PowerShell לא עובדת בערוץ מאובטח בין תחנה לשרת או בין שרת לתחנה, אז תקחו את זה בחשבון.

קצת חפירה לפני שממשיכים :) - לא מאמין שהגעתי לחלק 10 !

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

העבודה שלי על הבלוג ועם המדריכים של ה PowerShell ממש "תיכנתה" את המוח שלי בצורה חדשה לגמרי, לזכור דברים ללמוד דברים, וזה תענוג, והכל בגלל התמיכה שלכם בבלוג שלי, אני רואה יותר ויותר אנשים קוראים, מגיבים, מעודדים לכתוב עוד ועוד וזה תענוג אחד גדול !

רציתי להגיד לכם תודה רבה על הפידבקים שלכם, לא מאמין שהגעתי לחלק 10 ! מדריך שלם מ-10 חלקים !! זה אדיר ! אני מקבל הרבה מאוד פידבקים במייל שלי (אם שכחתם לרגע levl@leidertech.co.il) ותודה רבה לכם על זה ! אתם שואלים שאלות, אתם עוזרים לי גם להבין דברים ! המון תודה רבה קוראים יקרים !

"אחרי שצחקנו, נעבור לחלק האומנותי" (מתוך "גבעת חלפון אינה עונה"..)

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

תחשבו על זה רגע, במידה ואתם פותחים חיבור ישיר לשרת או למחשב או לכמה שרתים וכמה מחשבים הוא נשאר פתוח, ואם אני פותח סשן לצורך הפעלת פקודה? הסיכוי שמישהו יצליח לתפוס פאקט הוא יותר נמוך מאשר חיבור שנשאר קבוע, ככה שהרבה יותר בטוח לעבוד בו (כמובן במידה ואפשר, אם אין אפשרות אנחנו נתחבר בעזרת Enter-Pssession 
שדיברנו עליו בחלק 9 ניתן לקרוא כאן : חלק 9).

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

¿*בשביל שתוכלו לגשת למחשב מרחוק, צריך להפעיל עליו את הפקודה enable-psremoting *¿

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

Invoke-Command - בתרגום לעברית : "הפעל-פקודה" -
כמו שאנחנו מכירים ב PowerShell כל הפקודות בנויות בצורה של "מה שאתה רוצה, זה מה שאתה מקליד" אז מה שאנחנו רוצים זה להפעיל פקודה מרוחקת על מחשב, ואז לקבל את הפלט שלה (מעצבן כמה שזה פשוט נכון?) 

מבנה הפקודה עם תרגום לעברית :{הפקודה\הסקריפט שלך פה} Invoke-Command -computername -scriptblock 
הפעל-פקודה -שם מחשב -מקטע_סקריפט {הפקודה\הסקריפט שלך פה}

אז בעצם אם נרצה להריץ פקודה מסויימת על מחשב מסויים, לדוגמא, נריץ את הפקודה בצורה הבאה:

נריץ פקודה מרוחקת על מחשב בשם client1 בשביל לקבל מידע אודות ה IP שלו:

Invoke-command -computername client1 -scriptblock {ipconfig}

הפלט שנקבל:


אני אריץ את אותה הפקודה על השרת עצמו ואז תראוה שאני מקבל כתובת שונה לחלוטין:

(תשימו לב להבדל.. החלק הראשון מראה כתובת 10.0.0.11 החלק השני, מראה כתובת 10.0.0.1)



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

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

נבצע את זה בעזרת הפקודה Get-Command (כמו שלמדנו בחלקים הראשונים של המדריך), רק שאנחנו נריץ אותה על השרת מהתחנה שלנו, ונבקש להציג לי מידע שיסביר לי איזו פקודה אני צריך בשיל להציג מידע, מה שנקרא "Get":

Invoke-Command -computername cat1 -scriptblock {get-command -noun *user* -verb get}

אני אתרגם רק את החלק של קטע הסקריפט (ScriptBlock) - :
noun - שם עצם
verb - פעול

זאת אומרת, אנחנו מבקשים מ PowerShell שיציג לנו פקודה שהשם עצם שלה הוא "משתמשים" והפועל זה "קבל"\"לקבל" וכד', זאת אומרת אם אני מחבר זה יוצא בערך ככה : הצג-פקודה -שם עצם "משתמשים" -הפועל "הצג".
או בקצרה "הצג לי פקודה שהשם עצם שלה זה "משתמשים" והפעולה שאני רוצה לבצע עליה זה "הצג".

וזאת בדיוק התוצאה שנקבל מהתחנה שלנו:


לאחר שקיבלנו את המידע שאנחנו צריכים, בשביל שנראה שאני על תחנה ולא על שרת, אני אריץ את הפקודה הרלוונטית שהיא Get-Aduser ונראה שבגלל שעל התחנה שלנו אין מודול של ActiveDirectory אנחנו לא נקבל את המידע הרלוונטי וכל המסך שלנו ישפך ב"דם" (מושג PowerShell בגלל שהשגיאות בצבע אדום):



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



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

נתחיל בלבדוק אילו משתמשים יש לנו על השרת ב OU שנקרא USERS בכלל:

Invoke-Command -computername cat1 -scriptblock {get-aduser -filter * -searchbase "ou=users, ou=lions,dc=linos,dc=local}|select name

הסיבה שרציתי קודם כל לבצע את הפקודה הנ"ל היא בשביל שתעלה לכם השאלה הבאה:

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


כפי שניתן לראות, יש בשרת שלושה משתמשים, עכשיו נוסיף עוד משתמש אחד:



עוד דוגמא, הפעם אני רוצה לעשות את זה קצת יותר מעניין..

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

קודם נבדוק מה ה Scope שלנו:
invoke-command -computername cat1 -scriptblock {
Get-DhcpServerv4Scope |select -ExpandProperty scopeid |select -ExpandProperty IPAddressToString
}



במקרה שלי ה Scope הוא 10.0.0.0

לאחר מכן, נבקש מהשרת שיתן לנו 20 כתובות IP פנויות
invoke-command -computername cat1 -scriptblock {Get-DhcpServerv4FreeIPAddress -ScopeId $scope -NumAddress 20}



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

ניתן לרשום את הכל בתוך סקריפט אחד בצורה הבאה:
invoke-command -computername cat1 -scriptblock {

$scope = Get-DhcpServerv4Scope |select -ExpandProperty scopeid |select -ExpandProperty IPAddressToString

Get-DhcpServerv4FreeIPAddress -ScopeId $scope[0] -NumAddress 20

}





עד כאן להפעם, כמו תמיד תודה רבה שקראתם.

המייל שלי לכל שאלה: levl@leidertech.co.il

כמו תמיד, סרטון מצולם:

14/11/2021

פתרון לתקלה בפתיחת קבצי Power Point, Excel, Word מתקבלת השגיאה Access denied, Contact your administrator

 


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

בתור איש מחשוב, במידה ואתם ממלאים תפקיד של ראש צוות, מנכ"ל או מי שלא תהיה ואתה אחראי על אנשי צוות בתחום שלנו, חובה חובה חובה, לשתף ידע בין אנשים, אתם תתפלאו כמה זמן זה יחסוך לכם, כפי שרשמת לפני כן, אני נוהג לשלוח מייל עם תבנית מסויימת כמו לדוגמא "פתרון לתקלה: כשאתם מנסים לפתוח קובץ מתקבלת ההודעה Access denied, Contact your administrator", ככה שכשאנשי הצוות רוצים למצוא את הפתרון שהם צריכים, לא מסתבכים בחיפוש במייל ומבצעים חיפוש, גם אם מדובר בעובד הכי מבולגן בעולם.

¿?זכרו - בתפקיד שלנו, מילת המפתח היא פרודוקטיביות¿?

ראשית חשוב לי להגיד, התקלה יכולה לקרוא גם בסביבת Domain וגם בסביבת WorkGroup, כאשר אחד המשתמשים שלכם מנסה לפתוח קובץ מתוך כונ רשת בשרתי הקבצים או NAS (דיסק רשת).

תסריט אתם מנסים לפתוח קובץ Power Point:
אתם לוחצים "דאבל קליק" על קובץ ומתקבלת ההודעה  "Access denied, Contact your administrator"

לאחר מכן אתם מנסים לפתוח קובץ Word
ומתקבלת ההודעה:"Word could not create the work file. Check the temp"



קבצי אקסל עלולים לקבל את אותה השגיאה, ההרשאות תקינות לחלוטין.

"אחרי שצחקנו, נעבור לחלק האומנותי" (גבעת חלפון אינה עונה)

להלן פתרון לתקלה:

יש למחוק את הערכים האלה:

 יש למחוק את הערכים האלה:

[Word Preview]

HKEY_CLASSES_ROOT\CLSID\{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}


[PowerPoint Preview]

HKEY_CLASSES_ROOT\CLSID\{65235197-874B-4A07-BDC5-E65EA825B718}


[Excel Preview]

HKEY_CLASSES_ROOT\CLSID\{00020827-0000-0000-C000-000000000046}


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

09/11/2021

איך לזרז את תהליך תחילת הארכיון ב 365?



יש המון אנשים היום שעובדים עם 365, לפעמים המיילים של המשתמש שלנו מתפוצצים ויש צורך ביצירת ארכיון און ליין, מה שנקרא In Place Archive (מה שאנחנו הכרנו פעם בתור On Line Archive).

בדרך כלל המשתמש צריך רישיון של on line archive (כן יש רישיון רק לזה) או שיש לו Plan 2, לאחר מכן אנחנו ניגשים לרשימת התיבות, ומאפשרים את הארכיון אצל המשתמש.

הבעיה היא שלוקח זמן עד שהתהליך הזה בכלל מתחיל, ויש כמה פעולות שצריך לבצע בשביל שהתהליך הזה יתחיל כמו שצריך בעזרת פקודות PowerShell.

(אם אתה לא יודע להריץ פקודות של PowerShell על 365, השתמש במדריך הזה: "איך להתחבר ל 365 עם PowerShell?")


נתחיל עם הפקודה הראשונה:

Start-managedfolderassistant -Identity luser@mailbox.com -FullCrawl

במידה ולאחר כמה שעות אתם מגלים שעדיין לא התחיל התהליך, ואתם מקבלים את אחת השגיאות הבאות:

1.The call to Mailbox Assistants Service on server: 'VI1PR04MB6159.eurprd04.prod.outlook.com' failed. Error from RPC is -2147220992.

2.The call to Mailbox Assistance Service on server: ‘NAME’ failed.  Error from RPC is –2147220989

בצעו את הפעולות הבאות:

1. הריצו את הפקודה הזאת - 

 get-mailboxLocation –user username@domain.com | fl mailboxGuid,mailboxLocationType

הפלט אמור להיראות כך:

MailboxGuid         : aace1f4e-5181-4855-a0c7-466f1fe2f1d1

MailboxLocationType : Primary

MailboxGuid         : c2098d94-d55b-4a06-9b52-d485c54e9a19

MailboxLocationType : MainArchive


2. לאחר מכן נריץ את הפקודה הזאת - 

Start-ManagedFolderAssistant aace1f4e-5181-4855-a0c7-466f1fe2f1d1

את החלק עם המספר מזהה בסוף הפקודה השניה (ה-Guid)  לקחנו מה MailboxGuid - תזהרו לא להתבלבל, אחרת זה לא יעבוד

הדבר היחיד שנשאר לעשות עכשיו, זה לחכות, ניתן לבדוק  בעוד כמה שעות בממשק ה 365 האם התהליך התחיל או לא.


13/09/2021

איך לשחק משחקי פלייסטיישן (PSP) בחינם על טאבלט או טלפון אנדרואיד?

Credit for the Picture: Here


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

אני חושב שמצאתי פתרון מאוד יצירתי, התחלתי לחקור ברשת מה אפשר לעשות עם הטלפון שלי במהלך טיסה או לפני טיסה וגיליתי שאני יכול לשחק עליו משחקים של PSP (מה שהיה פעם פלייסטיישן נייד), ואז לקחתי את זה צעד קדימה, יש לי טאבלט מדגם Samsung Tab S6, וכידוע ניתן לחבר עכבר, מקלדת, בקר משחק עם USB לטלפון אנדרואיד וגם לטאבלט אנדרואיד.


אז מה בעצם צריך בשביל לשחק?

1) טאבלט אנדרואיד או טלפון אנדרואיד (משהו מתקדם, המכשיר הכי ישן שהיה לי לבדוק זה Samsung Note 8 )

2) מתאם USB ל Type-C




3) בקר משחק - עדיף עם כבל ולא אלחוטי (בצורה של פלייסטיישן או בצורה של XBOX, כל אחד מה שהוא אוהב) כי באלחוטי יש דילאי שלא מאפשר לשחק כמו שצריך.


4) כרטיס זכרון (מיקרו SD) - אני ממליץ לרכוש 64 גיגה (במידה ויש לכם מספיק מקום בטלפון או בטאבלט, לא צריך לרכוש)

5) אמולטר (תוכנה שמדמה סביבה מסויימת ו"מרמה" את התוכנה שהיא צריכה להריץ) - חינמית שעובדת כמו שצריך, בשם PPSSPP, כן שם קצת מוזר, אבל זה עושה את העבודה - להורדה לחץ כאן - עדיף להכנס לקישור דרך הטלפון או הטאבלט, תורידו ופשוט תתקינו.

¿? לידע כללי ¿? 

יש גירסה חינמית ויש גירסת PRO שעולה כסף, להגיד לכם את האמת? לא יודע מה ההבדל, התקנתי את הגירסה החינמית וזה עובד כמו שצריך.

אז מה צריך לעשות בשביל לשחק?

1) להוריד את האמולטור בטלפון
2) להוריד משחק
3) להעביר את המשחק לטלפון\טאבלט - משחק נקרא ROM.
4) להפעיל את האמולטור
5) לבחור את התיקיה שבה נמצא המשחק ולהתחיל לשחק.


לעוד שאלות וליצירת קשר, המייל שלי: levl@leidertech.co.il

כמו תמיד, מדריך מצולם:

11/04/2021

מדריך ל PowerShell בעברית חלק 9 - התחברות ועבודה על מחשבים מרוחקים עם PowerShell Remoting.


חלק 9 - התחברות למחשבים מרוחקים: PowerShell Remoting.


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

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

ברגע שמפעילים את ה Remoting מאחורי הקלעים קוראים הדברים הבאים:
  1. הסרוויס - WinRm מתחיל לפעול, ונהיה על מצב אוט'
  2. חומת האש של ווינדוס (אם יש לכם חומת אש חיצונית, תצטרכו לעשות את זה ידנית) תיצור חוק (Rгle) רגיל ל WsMan (מוזמנים לחפש ברשת מה זה) - ההתחברות עם PowerShell לא עובדת בארוץ מאובטח בין תחנה לשרת או בין שרת לתחנה, אז תקחו את זה בחשבון.


שימו לב - אם אתם בסביבה שהיא לא "דומיין" ההגדרות הרבה יותר מוסבכות.


אתחיל בכך שאומר, יש הבדל גדול בין לעבוד מרחוק על מחשבים או שרתים (זאת אומרת להתחבר אליהם) לבין לנהל אותם, למה הכוונה? נגיד שאנחנו רוצים לקבל מידע על משתמש מתוך אקטיב דירקטורי, ישנן 2 דרכים לעשות את זה ב PowerShell:
  1. PowerShell Remoting להתחבר מרחוק לשרת - לפתוח Tunnel לשרת ה AD ולעבוד עליו.
  2. Implicit Remoting - להשתמש בפקודה שתרוץ על המחשב המרוחק, תשתמש במשאבים של המחשב המרוחק ולנו תציג רק את המידע, מאפשר להריץ פקודות ממודולים שלא מותקנים על התחנה שלנו, בעזרת הפקודה
    Invoke-Command, לדוגמא להריץ get-aduser ממחשב שלא מותקן עליו בכלל שרת AD.
במדריך הונכחי אנחנו נלמד על PowerShell Remoting (האופציה הראשונה) בלבד - שאיתו נתחבר למחשבים מרוחקים ונעבוד עליהם, במדריך הבא נלמד על האופציה השניה, שימוש בפקודה בלבד ללא הצורף להתחבר למחשב מרוחק.


בתור ברירת מחדל, WinrRm מאופשר בשרתים (לדעתי כבר משרתי 2008), ולכן אם נריץ לדוגמא את הפקודה הבאה מתוך קלינט (שם השרת במקרה הזה הוא cat1 - כי אני רוסי ואני אוהב חתולים 😊, הדומיין שלי במקרה זה הוא Lions.local סתם לידע כללי 😋):
 get-services -computername cat1

נקבל פלט תקין, כמו בדוגמא:



אז PowerShell Remoting, מה זה בעצם?


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

אם נשאל את PowerShell כמה פקודות שקושורות ל Pssession יש (זוכרים את הפקודה Get-Command?) 
Get-Command -Noun PSSession

נקבל את כל הפקודות הללו:
Connect-PSSession
Disconnect-PSSession
Enter-PSSession
Exit-PSSession
Export-PSSession
Get-PSSession
Import-PSSession
New-PSSession
Receive-PSSession
Remove-PSSession


אנחנו נתמקד בכמה עיקריות:

Enter-Pssession
New-Pssession
Get-Pssession
Remove-Pssession





במידה וננסה להתחבר לתחנה שלא מאופשר בה PowerShell Remoting נקבל שגיאה שתמלא לנו את המסך ב"דם".

אם ננסה להתחבר למחשב שכן מוגדר לקבל בקשות התחברות של PowerShell נקבל שורת פקודה ואת שם המחשב המרוחק שאליו אנחנו מחוברים כמו בדוגמא הבאה:

מתחברים למחשב מרוחק בעזרת הפקודה הבאה:

enter-pssessiotn - computername cat1

ואם הכל בסדר אז נקבל חלון כזה (שימו לב, שם המחשב המרוחק מופיע מצד שמאל, בתחילת שורת הפקודה):




ועכשיו אני יכול להתחיל להריץ עליו את כל מה שאני רוצה, כאילו אני עובד על השרת עצמו, בדומה ל RDP רק בשורת הפקודה, במקרה הזה אנחנו מחוברים לשרת שהוא DC, אז אפשר להריץ מהתחנה הזאת את הפקודות של ה ActiveDirectory, ואז בהתחלה PowerShell יעשה לסשן הנוכחי את המודול של ה Active Directory ואז אפשר להריץ את כל מה שאנחנו יכולים להריץ על השרת מרחוק - לדוגמא (שימו לב לשם של המחשב המרוחק שאנחנו עובדים עליו מצד שמאל, זה אומר שאנחנו לא עובדים על המחשב המקומי !):



חשוב לזכור, אם אנחנו סוגרים את חלון ה PowerShell שלנו, זה סוגר לנו את הסשן

אם נרצה להתחבר למחשב מרוחק שעליו לא מוגדר ה PowerShell Remoting, נקבל את השגיאה הבאה:


אם תקראו את השגיאה, תראו שכתוב שם בגדול "תבררו שהסרווריס במחשב היעד מוגדר ומוכן לקבל חיבורים", ואיך בעצם מגדירים את זה במחשב היעד?

אז קיימות שני דרכים: 
1. במידה ויש לכם גישה למחשב היעד - לפתוח PowerShell בתור אדמין ולהריץ את הפקודה: Enable-PSRemoting
2.לאפשר דרך Group Policy.
3. במידה ואין לכם גישה למחשב היעד - יש עוד דרך אבל היא מסובכת קצת ואני לא רוצה לבזבז את הזמן על זה, תכתבו לי בתגובות אם אתם רוצים לדעת כיצד לבצע את הדרך המסובכת, ואם יהיו מספיק תגובות, אני אצור מדריך יעודי לזה.

אנחנו נתמקד באופציה הראשונה, נפתח את PowerShell בתור אדמין ונריץ שם את הפקודה Enable-PSRemoting, מה שיקרה, זה ש PowerShell יגדיר את כל מה שצריך באופן אוט' (כמו שניתן לראות, הגדרות בחומת האש של התחנה, הגדרות של הסרוויס עצמו וכד')



ועכשיו אם נרצה להתחבר למחשב הזה ממחשב אחר, לא תהיה שום בעיה (בכוונה השארתי את החלון הקודם שתוכלו לראות שבהתחלה לא הצלחה להתחבר וקיבלנו מסך מלא ב"דם" ומתחת לשגיאה, אנחנו מצליחים להתחבר לאות מחשב ללא כל בעיה):



בתור ניסוי, ננסה מהמחשב המרוחק, ליצור תיקייה בשם LeiderTech על מחשב client1, כמו כל דבר ב PowerShell גם כאן המבנה של הפקודה מאוד מאוד פשוט ולפי הגיון - אנחנו רוצים ליצור תיקייה בכונן :C בשם LeiderTech:
:new-item -name LeiderTech -type directory -path c


רגע של חזרה על המאמר הראשון בסדרה לגבי "עזרה": בשביל להציג עזרה ורק דוגמאות נריץ את פקודת העזרה בצורה הזאת:
help new-item -examples

והמערכת מראה לי איך אני אמור לכתוב את הפקודה בשביל ליצור תיקייה (ההפך הגמור ממה שאני רשמתי למעלה ובלי גרשיים בכלל - זה כל היופי במערכת הזאת, הגמישות):
"New-Item -Path "c:\" -Name "logfiles" -ItemType "directory

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

והינה התוצאה:

בתצלום העליון ניתן לראות שאנחנו נמצאים על מכונה ומחוברים מרחוק לתחנה בשם Client1 (מצד שמאל יש את השם של התחנה שאליה אנחנו מחוברים):


בתצלום התחתון אנחנו יכולים לראות שנוצרה תיקייה בשם LeiderTech.

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


כמו תמיד, להלן מדריך מצולם:





המייל שלי לכל שאלה: levl@leidertech.co.il

לכלל המדריכים אודות PowerShell הכנסו ללינק הזה: כלל המדריכים




17/01/2021

מדריך ל PowerShell בעברית חלק 8 - איך לייצא מידע לקובץ CSV מ-PowerShell?

חלק 8 - איך לייצא מידע לקבצי CSV מ PowerShell?

 


כמו תמיד - במידה ולא עברתם על החקלים הקודמים - ראשית עברו על החלקים הקודמים ורק לאחר מכן המשיכו לקרוא:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן

בפרק הקודם למדנו כיצד ליבא קבצי CSV, אך מה לעשות אם אנחנו צריכים ליצא קובץ CSV? ליצא מידע מהמערכת ולהעבירו למישהו וכד', בדיוק לכך נועדה הפקודה export-csv

כמו שכבר ראינו, PowerShell מאוד נוחה ומאוד פשוטה, והכי חשוב מאוד הגיונית, אם יבוא של קובץ נבצע בעזרת הפקודה Import-csv, אז איך בעצם נבצע יצוא? - ניחשתם נכון, בעזרת export-csv.

הכי קל לצורך ההדגמה היא לעשות יצוא של רשימת הפרוססים שרצים לי במחשב, אבל לצורך ההדגמה אני אפתח את ה Notepad כמה וכמה פעמים וארץ את הפקודה הבאה:

Get-Process notepad| export-csv -Path 'C:\Users\lev\Desktop\PowerShell - CSV post\test.csv'

הפלט יהיה דיי מסורבל האמת ולא הכי ברור, כבר למדנו בפרקים הקודמים שניתן לבצע בחירה של העמודות (Property) שאותם נרצה להציג בעזרת הפקודה select-object, אז נוסיף אותה גם כן והתוצאה הסופית של הפקודה תהיה כזאת:

Get-Process notepad|select ProcessName, id, cpu| export-csv -Path 'C:\Users\lev\Desktop\PowerShell - CSV post\test.csv'

וזה התוכן שנקבל בתוך קובץ ה CSV:



בטח אתם שואלים את עצמכם מה זה ה"Type" הזה שהופיע לנו?

אז בתור התחלה אם תריצו Get-process notepad | get-member, למעלה תקבלו את המידע הזה:


כרגע לא ממש מעניין אותנו מה זה (ובכל זאת בחרתי להוסיף משהו קטן על הנושא ולכן במדריך המצולם אנחנו נותנים דוגמאות והסבר קצר על מה זה), אבל בשביל שזה לא יופיע לנו בקובץ אקסל, אנחנו יכולים להגיד ל PowerShell שאנחנו פשוט לא רוצים את זה שם עלידי הוספת הפרמטר "NoTypeInformation" מה שיגרום לכך שהפקודה תשתנה קצת ותראה ככה: 

Get-Process notepad |export-csv -Path 'C:\Users\lev\Desktop\PowerShell - CSV post\test.csv' -NoTypeInformation

בתור ברירת מחדל, אם אנחנו נריץ את הפקודה על פרוססים שונים, הקובץ כל פעם יתחלף, ובעצם המידע לא יתווסף אלה ישוכתב, בשביל שהוא לא ישוכתב אנחנו נצטרך להשתמש בפרמטר "Append" (בתרגום לעברית : לצרף, להוסיף), ונצרף אותו לפני "NoTypeInformation" (אני מודה שאף פעם לא ניסיתי לשנות את המיקום שלהם, אך אם בא לכם בשביל הספורט, נסו ועדכנו אותי בתגובות, האם הצלחתם או לא), לצורך הדגמה נריץ את הפקודה ונראה את השוני:

תחילה נריץ את הקובץ הקודם ונראה את התוצאה - הקובץ שנוצר:




במידה ונריץ את אותה הפקודה ונחליף את השם של הפרוסס, הקובץ ישוכתב, ועל מנת שהוא לא ישוכתב אלה יתווסף אל המידע הקיים בקובץ, אנחנו נוסיף את הפרמטר "Append" ונראה את התוצאה:

Get-Process taskhostw |export-csv -Path 'C:\Users\lev\Desktop\PowerShell - CSV post\test.csv' -Append  -NoTypeInformation



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


להלן דוגמא "מהחיים" לסקריפט שמיבא את כלל תיבות הדואר מתוך ה-365 ובודק גודל תיבה:

$users = Import-Csv "C:\CSV Test\Alias_test.csv"
 
 foreach ($user in $users) {

 Get-MailboxStatistics -Identity $user.UserName |

 Select-Object @{l="User Name";e="DisplayName"},

  @{l="Mail Box Size";e="TotalItemSize"}, @{l="Total Emails?";e="itemcount"} |

  Export-Csv "C:\CSV Test\Mailboxe_size.csv" -Append -NoTypeInformation
 } #end of ForEach loop




לכל שאלה המייל שלי: levl@leidertech.co.il







לעוד מדריכים:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן


מדריך ל PowerShell בעברית חלק 7 - איך לייבא קובץ CSV לתוך PowerShell?






חלק 7



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

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן


אני מאמין שכולנו מכירים את המושג הזה "קובץ CSV" אבל לא הרבה יודעים מה המשמעות של CSV, אז הינה אם רציתם לדעת מה זה בדיוק, אז המשמעות היא "ערכים מופרדים בפסיקים" או Comma separated value, לרוב אנחנו מכירים קבצי CSV, בהקשר של אקסל, כי שם יש אופציה לשמור קובץ בתור CSV, אבל האמת היא שאפשר ליצור קובץ CSV בעצמנו בצורה מאוד פשוטה בתוך Notepad, פשוט רשמו שתי שדות שונים עם פסיק באמצע ומתחת לזה ערכים עם פסיק באמצע, ותשמרו אותו עם סיומת CSV, וקיבלתם קובץ CSV כמו שמייצר אקסל.

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

ניתן לבצע מגוון רחב של מוניפולציות על קבצי CSV, בעזרת הפקודה import-csv.


שיעור קצר בפרודוקטיביות - תרשו לי קצת לסתות מהנושא.

(מי שאין לו כוח לקרוא את החלק הזה - מוזמן לדלג להמשך הפוסט - החלק הזה הוא רק לידע כללי)

אני חסיד מאוד גדול של פרודוקטיביות, ומבחינתי כל דבר שמקצר לי את זמן העבודה בצורה משמעותית, בעיניי קדוש.
במידה ורמת העצלנות שלכם היא כמו שלי (העצלנות שלי היא ברמת - "אלוהים") ואין לכם כוח לעשות את אותו הדבר כמה וכמה פעמים אז המדריך הזה יעשה לכם את החיים מאוד מאוד קלים.. כמובן שאני לא מדבר על מצב שבו אתם צריכים לבצע שינויים ב-5 משתמשים, מאחר וכמות הזמן שתבזבזו על בנית הסקריפט, חיפוש באינטרנט (במידה וחסר לכם ידע או שנתקלתם באיזו שהיא שגיאה), יהיה כבר לא משתלם מה שנקרא בשפת העם "אם הייתי עושה את זה בצורה הרגילה, כבר הייתי מסיים מזמן", בצעו חישוב של "זמן\תועלת", זכרו שאתם עובדים בשביל מישהו - ואני לא מדבר על הבוס שלכם, אני מדבר על הלקוח שלכם שבכל מקרה זה יהיה מישהו שאתם עובדים על השרת שלו מרחוק או לחלופין המקום עבודה שאתם עובדים בשבילו, הוא בסופו של יום משלם לכם כסף לא בשביל "חימום הכיסא", אלה בשביל העבודה, ואם הזמן שלקח לכם למצוא פתרון ולישם אותו הוא יותר מדי ארוך, כנראה הפתרון שחשבתם עליו לא פרודוקטיבי, והוא לוקח לכם יותר מדי זמן, הלקוח כועס, לא למדתם כלום כי קיבלתם עצבים, בקיצור, בזבזו זמן של כל העולם והבריאות שלכם, והכי חשוב במקום סיפוק והצלחה, תחושו כישלון ואכזבה, וזאת לא תוצאה טובה.

לכן, במידה ומדובר במשימה שמצריכה ביצוע מוניפוליציה על כמה אובייקטים ביחד, (10 ומעלה) הייתי שוקל באמת לעבור לכתיבת סקריפט, זכרו שאם אתם מכירים פתרון יותר יעיל בשפת סקריפט אחרת, גם זה בסדר ! לא חובה להשתמש אך ורק ב PowerShell - אני מבין שאנחנו לומדים כאן PowerShell, אבל זכרו לבצע "ניסוי" בזמנים שמתאימים לכם ולכולם ולא על חשבון העבודה שלכם או בשעת לחץ - במיוחד אם אתם לא "משופשפים" מספיק בתחום, ככה שחשבו טוב טוב האם כדי לכם במקרה ספציפי לכתוב סקריפט ב PowerShell או שאולי כדי לעשות דברים קצת יותר פשוטים ולאחר מכן להתחיל לעבור לישום פתרונות יותר מסובכים עם PowerShell.

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

מנסיוני - אני יכול להמליץ לכם להתחיל עם סקריפטים מאוד פשוטים, בדיקת תקשורת וכאלה, דברים שאתם בונים אפילו "רק למגירה" בשביל להתנסות, אני מביא לכם כאן סקריפט שכתבתי בתחילת דרכי - סקריפט פשוט לבדיקת תקשורת.. מה שאתם מכירים בתור "פינגים" רק בשפת PowerShell (ובכוונה עשיתי אותו מסובך מאוד בשביל ללמוד :))



cls
write-host -BackgroundColor Blue "##########################"
write-host "Network Testing Script"     
write-host "`n"
write-host "Made by:"
write-host "`n"
Write-Host "LeiderTech's It Department"
write-host "`n"
write-host -BackgroundColor Blue "##########################"

write-host "`n"
write-host -BackgroundColor Gray "What this thing do?"
write-host "`n"
write-host "This script will 'Ping' each computer for 2 times 
            `n and write the result in a colorable answer"

write-host "`n"
write-host "Have fun"
write-host "`n"
#Ask user for the computer names or ip's
$orgspc = (Read-Host -Prompt "Please write the computer names of the pc's you want to check, with comma seporated (you can combine IP's and pc's to: 192.168.2.1,pc-01 etc..)").split(',') | ForEach-Object {$_.trim()}

#start the foreach loop
         foreach ($pc in $orgspc) {

 #The "if" quastion:         
          $VerbosePreference = 'continue'
          if (Test-Connection -computername $pc -Count 2 -Quiet) 
          {write-host -BackgroundColor green -ForegroundColor Blue "`nThe connection to ->$pc<- is OK :) !!!" }
 #The "Then" condition
          else { Write-Verbose "`nThe Connection to ->$pc<- is not good :( !! "}
          }
          write-host "`n"  
          pause



אז לעיניינו - 

מתי נשתמש ב CSV?
אז אחרי שחפרתי לכם קצת,  נחזור לנושא שבגללו בעצם הגעתם לפוסט הזה, מתי נשתמש בקובץ CSV בעבודה שלנו?

ישנן המון סיבות ומצבים בהם נשתמש בקובץ CSV, להלן שתי הסיבות העיקריות שלי אישית יצא להשתמש בקובץ CSV:
  1. אקטיב דירקטורי (Active Directory) - תתארו לעצמכם שאת כל בניית הדומיין החדש שלכם אתם יכולים לעשות בצורה מאוד נוחה, ובתוך קובץ CSV (לרוב אנחנו נשתמש באקסל למטרה הזאת) ולאחר שביצענו שינויים ועריכה של המשתמשים לדומיין החדש - תתארו לעצמכם שאתם צריכים ליצור אקטיב דירקטורי שלם של 80-90 משתמשים.. עם הסיסמאות והפרטים המלאים שלהם.
  2. אופיס 365 (Office 365) - המון אנשים היום עוברים לאופיס 365, מיקרוסופט מאפשרים לעבוד עם PowerShell מול אופיס 365 בצורה דיי נוחה, מה שמאפשר לנו אנשי המחשוב לעבוד בצורה הרבה יותר פרודוקטיבית, ונוחה.
  3. וירטואליזציה - ניתן להפעיל ולכבות מכונות וירטואליות, לבצע שינויים על מכונות וירטואליות.
  4. כל דבר שמצריך ממכם לבצע פעולות על אובייקטים שונים - כולל הדברים הכי פשוטים, לבדוק תקשורת, לכבות מחשבים וכו' וכו'.


אז ראשית, למי שלא מכיר איך יוצרים קובץ CSV?

במידה ואין לכם מושג איך יוצרים קובץ CSV - לימדו כיצד ליצור את הקובץ וחזרו למדריך מאחר ומדובר בידע מאוד בסיסי חובה עליכם לדעת כיצד עושים זאת - אך ומאחר ואין לכם אותו, למדו כיצד ליצור קובץ CSV ולאחר מכן חזרו להמשך המדריך.

אז איך בעצם ליבא את הקובץ לתוך PowerShell?

את הקובץ אנחנו מיבאים בצורה הכי פשוטה והכי אינטואיטיבית שיכולה להיות, בעזרת הפקודה import-csv בצורה הבאה:

import-csv  ואז את הנתיב המלא של הקובץ - שימו לב שאנחנו משתמשים בגרש "בודד" ולא גרשיים "כפולים" כאשר אנחנו רושים את הנתיב (זאת מעבר לעובדה שאפשר להשתמש ב-TAB לצורך השלמת הנתיב), ובמקרה של הדוגמא שלי, אני רוצה לביא קובץ שנמצא בתוך תיקייהת "PowerShell posts" על שולחן העבודה שלי - שנשמר בשם "users.csv".

מאוד חשוב שתבינו איך נראה הקובץ CSV שלי על מנת שתוכלו להבין מה רואים בפלט של PowerShell

אז אני מציג לפניכם את היצירה האחרונה שלי - קובץ בשם Users.csv






לצורך הנוחות בהדגמה אני אשתמש ב ISE:

ניבא את הקובץ: 'import-csv 'C:\Users\lev\Desktop\PowerShell - CSV post\users.csv

ומיד בקונסול נוכל לראות ש PowerShell מצליח לקרוא את כל המידע רק שהוא מציג לנו את המידע כרשימה - כזאת ברירת המחדל ביבוא.

(עכשיו השאלה.. האם הייתם "ילדים" טובים ותרגלתם את כל מה שלמדתם או לא? תצליחו לבצע פלט של "טבלה?".. לי לא משנה.. איך המורה היתה אומרת בבית ספר? "אני כבר יודעת את החומר.." אבל האם אתם כן ידעתם? הגיבו לי למטה.. מי ממכם ידע ומי ממכם לא באמת ידע :).. תהיו אמיתיים.. אם עדיין היה לכם קשה.. חזרו על המאמרים הקודמים..)


נוסיף את ה format-table בסוף ונקבל את אותו הדבר שאפשר לראות בקובץ ה CSV שבנינו:
import-csv 'C:\Users\lev\Desktop\PowerShell - CSV post\users.csv'| ft -AutoSize

לא הוספתי את כל העמודות - כי התצלום מסך הוא רק בשביל להראות שהמערכת יודעת לקרוא את התוכן כמו שצריך


אחרי שהצלחנו ליבא את הקובץ, ניתן לעשות איתו בעצם מה שאנחנו רוצים, ניתן להפוך את כל הקובץ למשתנה ולהוציא ממנו אך ורק מידע ספציפי.. בצורה הבאה - פשוט נוסיף את שם המשתמש שאנחנו רוצים בתחילת הקובץ ולאחר מכן נוסיף את כל פקודת יבוא הקובץ וזה מה שנקבל:
'Csvfile = import-csv 'C:\Users\lev\Desktop\PowerShell - CSV post\users.csv$

ובעצם מתחיל להבנות לנו סקריפט:

השתמשו ב"הערות" שיהיה לכם יותר נוח להבין מה עושה כל שורה, במצב שבו יש המון שורות קוד, מאוד קשה לחפש את השורה הספציפית שלכם, הערות ב PowerShell מסומנות ב-# בתחילת השורה (הערות הן נושא בפני עצמו, ואנחנו נגיע לשם בהמשך - באחד החלקים, אני מאבטיח לכם)

Csv file Import#
import-csv 'C:\Users\lev\Desktop\PowerShell - CSV post\users.csv'| ft -AutoSize

Set file as variable#
'Csvfile = import-csv 'C:\Users\lev\Desktop\PowerShell - CSV post\users.csv$


לאחר שהצבנו את הקובץ שלנו במשתנה, אפשר להתחיל "לשחק איתו" בהמון מקרים אנחנו נשתמש בלולאת foreach מאחר וזאת אחת האופציות היחידות שתאפשר לנו בעצם לעבור על כל ערך ולעשות איתו משהו לדוגמא ליצור משתמשים באקטיב דירקטורי, לשנות שם לקבוצה באופיס 365 וכד על הדרך נחזור על השיעור של ForEach (למי שלא מכיר -  אם יש לכם מלא שאלות על הלולאה יש הסבר מלא: כאן):

ניצור את הלולאה שלנו:

foreach($haverim in $Csvfile){

write-host "I love to eat פרגיות with": $haverim."Last name" $haverim.'First Name'

}

ונקבל את התוצאה:




אם אני רוצה להציג רק את העמודה של Department, אני אציב את הקובץ שיצרתי במשתנה ואשתמש ב Select-object:

$Csvfile|select Department

והפלט שנקבל: 



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

נוכל להשתמש באחד מ"אופרטורי ההשווה" או באנגלית "Comparison Operators" ששייכים לפקודת ה Where-Object, לצורך סינון מסויים והצגה של מידע ספציפי - או במקרה שלנו, שורה שלמה מתוך קובץ ה CSV - זאת אומרת נקבל את המידע שיש בתוך כל "תא" בקובץ בהתאם לרובריקה שלו - אם בתא "Department" רשום "IT" על עובד מסויים, אז נקבל את הפלט לפי הדוגמא הבאה:

$list = $Csvfile |where {$_."first name" -eq "bruce"} 
$list



אם נרצה שפלט יהיה קצת יותר דומה לקובץ עצמו, נוכל להוסיף בסוף את ft -autosize





(לידע כללי - אם שאלתם את עצמכם מדוע שמתי את ה-First name בתוך גרשיים?
כי יש רווח בין שתי המילים וזה מסביר למערכת שצריך להשתמש בזה כאילו זה ערך אחד)

המידע שנקבל:
אם אני אסיר את הגרשים המערכת לא תבין מה אני רוצה ממנה ונקבל שגיאה:
המערכת מסמנת לנו שהיא לא מבינה מה זה "name" כי אין שדה כזה בקובץ CSV

נצא מנקודת הנחה שיש לנו קובץ עם המון ערכים ואנחנו רוצים להציג ערך מסוים רק שאנחנו לא זוכרים את שמו, במקרה כזה אנחנו נוכל להשתמש באופרטור "like" של הפקודה where-object - אל תשכחו לשים את הערך שאתם צריכים בתוך "כוכביות" על מנת שהיא תחפש את כל המילה ולא רק את ההתחלה או הסוף של הערך שלכם - במקרה הזה bru.

$list = $Csvfile |where {$_."first name" -like "*bru*"} 
$list  |ft -AutoSize



(בדקו את עצמכם - חושבים שהבנתם את החומר? תחשבו על התשובה וענו לי בתגובות..
בשאר הפוסט אני הולך להשתמש אך ורק במשתנה csvfile$ ללא הצורך ביבוא הקובץ מחדש.. למה בעצם?)


מאחר וקובץ CSV הוא קובץ שיש לו המון ערכים וכלל הערכים האלה נקראים "מערך" (באנגלית Array) אנחנו יכולים לגשת אך ורק ל"תא" מסויים, או לבצע פעולות אחרות שיעזרו לנו לגשת למידע מסוים בצורה הרבה יותר נוחה.

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

$Csvfile.count

נגיד ונבחר שורה ספציפית ונציג את כל המידע שיש בשורה הזאת:

$Csvfile[5]|ft -AutoSize

בגלל שהמערכת יודעת לקרוא את השמות של השדות, אז אני יכול לבקש להציג אך ורק ערך מסוים בתוך שדה מסוים:

$Csvfile[3].SamAccountName


זאת אומרת שבשביל לבחור שדה, אנחנו נשים "נקודה" ולאחריה את השם של העמודה שאנחנו רוצים להוציא ממנה מידע, חשוב לזכור שמדובר בקובץ אקסל, אז השורה של שמות העמודות לא נחשבת, השורה אחריה היא מספר "0" ואחרי היא מספר 1 זאת אומרת :

first name = לא נספר
Bruce = 0
Tami = 1
Adina = 2
Miri = 3

ככה שלפי הדוגמא שלנו נקבל את התוצאה "Miri" - למרות שבאקסל עצמו היא רשומה בשדה מספר 5.

ואיך זה נראה בקובץ ה CSV שלנו?:



ואם נריץ את אותו הדבר ונציב את "תא" מספר 5 נקבל את Ayala:

Alit  = 4
Ayala = 5




בחלק הבא נלמד כיצד נבצע את ההפך - ניצא את המידע שקיבלנו ב PowerShell ישירות לתוך קובץ CSV.

כמו תמיד:
המייל שלי לכל שאלה :levl@leidertech.co.il



לעוד מדריכים:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן