לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > מערכות הפעלה
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 02-07-2012, 16:02
צלמית המשתמש של קוביבי
  משתמש זכר קוביבי מנהל קוביבי אינו מחובר  
מנהל פורום מערכות הפעלה - הרובע המייקרוסופטי.
 
חבר מתאריך: 07.10.04
הודעות: 13,777
LinkedIn profile
Hello scripting guy

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

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

ping מהיר
לאלו מאיתנו שצריכים לבצע בדיקת תקשורת למספר רב של מחשבים באמצעות ping ואין להם סבלנות לחכות את הtimeout של ה-2 שניות עד שמקבלים תשובה כי הציוד אינו זמין: כתבתי את הפונקצייה הבאה ב powershell:
(פשוט להכניס לקובץ הפרופיל והוא יהיה זמין כפקודה)
קוד:
function pinghost ([string] $HOSTADDR, [int] $msec=100) { $pingjob = test-connection -computername ($HOSTADDR) -asjob if ($msec -gt 500) {$msec=500} while (($msec -gt 0) -and ($pingjob.state -eq "Running")) { Start-Sleep -m 50 $msec-=50 } $res = receive-job -id $pingjob.id remove-job -id $pingjob.id -Force return ($res.StatusCode -eq 0) }

אז מה זה בעצם עושה? (סלחו לי על הכיתוב המקוצר, לא היה לי הרבה זמן לכתוב את זה)
הפונקציה pinghost מקבלת 2 פרמטרים, הראשון הוא היעד אליו עושים ping והשני הוא כמות הmiliseconds המקסימליות אותה מעוניינים לחכות (1-500, מאית ועד חצי שנייה)

הפקודה הזו מתחילה בהפעלת ping אסינכרוני (הפעלת ping בלי לחכות לתשובה) ושומרת הצבעה לפעולה בפרמטר $pingjob
קוד:
$pingjob = test-connection -computername ($HOSTADDR) -asjob



הפקודה הזו מוודאת שלא נחכה יותר מידי זמן
קוד:
if ($msec -gt 500) {$msec=500}


לולאה שרצה כל-עוד התהליך הא-סינכרוני רץ וגם לא עברנו את מגבלת הזמן (בדיקה כל 50 מילי-שניות)
קוד:
while (($msec -gt 0) -and ($pingjob.state -eq "Running")) { Start-Sleep -m 50 $msec-=50 }


הכנסת השובה לפרמטר $res (אם התהליך עדיין רץ - $res יהיה ריק)
קוד:
$res = receive-job -id $pingjob.id


מחיקה בכוח של התהליך הא-סינכרוני (אם לא ענה עד שעבר הזמן - לא מחכים יותר, ואם כן - התהליך כבר הסתיים)
קוד:
remove-job -id $pingjob.id -Force


הסטאטוס של הפינג - 0 הוא הצלחה, אני מעוניין רק ב true/false, למי שמעוניין בתוצאה יותר מורחבת - רשימת הסטאטוסים מופיעים כאן תחת StatusCode.
קוד:
return ($res.StatusCode -eq 0)
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 09-07-2012, 17:47
צלמית המשתמש של קוביבי
  משתמש זכר קוביבי מנהל קוביבי אינו מחובר  
מנהל פורום מערכות הפעלה - הרובע המייקרוסופטי.
 
חבר מתאריך: 07.10.04
הודעות: 13,777
LinkedIn profile
עוד אחד - ביצוע ping ל tcp port
בתגובה להודעה מספר 1 שנכתבה על ידי קוביבי שמתחילה ב "Hello scripting guy"

בהמשך לסקריפט מלמעלה - ביצוע tcp-ping
עלה צורך אצלנו לברר לגבי כל אחד מחוות השרתים שלנו מול איזו מדינה הם מתקשרים הכי מהר לשם העלאת שירות גולבאלי.
הפתרון (שאני חשבתי עליו) - ביצוע ping לפורט 80 לאתרים מקומיים במדינות השונות והשוואת התוצאות,
השאלה - איך מבצעים ping לפורט ויותר מזה - איך מודדים את זה?
הפתרון: port-ping
קוד:
function port-ping { Param([string]$srv,$port=80,$timeout=3000,[switch]$verbose) $ErrorActionPreference = "SilentlyContinue" $blaaa = measure-command { $tcpclient = new-Object system.Net.Sockets.TcpClient $iar = $tcpclient.BeginConnect($srv,$port,$null,$null) $wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false) if(!$wait) { $tcpclient.Close() if($verbose){Write-Host "Connection Timeout"} Return $false } else { $error.Clear() $tcpclient.EndConnect($iar) | out-Null if(!$?){if($verbose){write-host $error[0]};$failed = $true} $tcpclient.Close() } } if($failed){return $false}else{return $blaaa.TotalMilliseconds} }


אז מה זה בעצם עושה?
הפונקציה port-ping מקבלת עד 4 פרמטרים, הראשון - לאיפה לבצע פינג, השני - לאיזה פורט (ברירת מחדל - 80), השלישי - כמה זמן לחכות לtimeout (ברירת מחדל - 3 שניות) והרביעי - פלט "מפורט" (ברירת מחדל - ללא)
קוד:
Param([string]$srv,$port=80,$timeout=3000,[switch]$verbose)


במקרה של שגיאה - ממשיכים בלי לעצור את התוכנית(תפירה מיוחדת לצרכים שלי) ומתחילים למדוד זמן ריצה של סט פקודות
קוד:
$ErrorActionPreference = "SilentlyContinue" $blaaa = measure-command


יצירת אובייקט מתאים + פתיחה של connection מסוג TCP ליעד + הגדרה של timeout
קוד:
$tcpclient = new-Object system.Net.Sockets.TcpClient $iar = $tcpclient.BeginConnect($srv,$port,$null,$null)


כמעט סיימנו: כל-עוד לא עבר ה timeout לבדוק אם נפתח ה connection
אם כן - סגירת הconnection, אם לא - העלאת שגיאה
קוד:
$wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false) if(!$wait) { $tcpclient.Close() if($verbose){Write-Host "Connection Timeout"} Return $false } else { $error.Clear() $tcpclient.EndConnect($iar) | out-Null if(!$?){if($verbose){write-host $error[0]};$failed = $true} $tcpclient.Close() }


ולסיום - החזרת שגיאה או משך הזמן שלקח לפתיחת הconnection
קוד:
if($failed){return $false}else{return $blaaa.TotalMilliseconds}


דוגמה לשימוש בפונקצייה:
החזרת משך הזמן שייקח למחשב לפתוח חיבור לאתר מייקרוסופט
קוד:
port-ping www.microsoft.com -port 80


החזרת 5 בדיקות שונות למשך הזמן שייקח למחשב לפתוך חיבור לאתר מייקרוסופט וכן לאתר nba
קוד:
1..5 | % {write-output "test $_"; "www.microsoft.com","www.nba.com" | % {port-ping $_ -port 80}}


החזרת 3 בדיקות למשך הזמן שייקח למחשב לפתוח חיבור לרשימת אתרים שמופיעים בקובץ והוצאת הפלט לקובץ:
קוד:
1..5 | % {write-output "test $_"; type sites.txt | % {port-ping $_ -port 80}} | out-file test.txt
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 18-07-2012, 11:33
צלמית המשתמש של קוביבי
  משתמש זכר קוביבי מנהל קוביבי אינו מחובר  
מנהל פורום מערכות הפעלה - הרובע המייקרוסופטי.
 
חבר מתאריך: 07.10.04
הודעות: 13,777
LinkedIn profile
ונמשיך - חיפוש ב event log
בתגובה להודעה מספר 1 שנכתבה על ידי קוביבי שמתחילה ב "Hello scripting guy"

סקריפט מקוצר כי הוא נועד למטרה מאוד ספציפית, אולי כשארחיב אותו אפרסם כאן.
עלה לי חשש שמישהו איפס לי את סיסמת המשתמש והסתקרנתי לדעת מי זה.
איפוס סיסמה מעלה event מספר 627 בשרת הDC שביצוע את השינוי (שינוי סיסמה - 628)
אז כתבתי את הסקריפט הבא אשר מקבל שם מחשב, מספר, ימים ושם לוג ומוציא את הevents המתאימים:
קוד:
function event-seek { Param([string]$srv,[int]$EID,[int]$days=1,[string]$log="EverySingleLogAvailable") $avail = port-ping -srv $srv -port 135 -timeout 100 if ($avail -eq $false) {write-output "$srv not available"; return $false} if ($log -match "EverySingleLogAvailable") { $list = $(Get-EventLog -list -computername $srv) | % {write-output $_.Log} } else { $list = $log } $days = -$days $eventdate = (get-date).AddDays($days) $list | % {Get-EventLog -computername $srv -log $_ -after $eventdate | where {$_.EventID -eq $EID} | fl *} }


איך? שאלה טובה
קודם כל: מכיוון שקריאה של event log מרחוק משתמש בWMI (שדורש RPC - הדרך של חלונות להתחבר ממחשב אחד לשני) צריך לוודא כי פורט 135 פתוח, אם לא - אין סיבה להמשיך
קוד:
$avail = port-ping -srv $srv -port 135 -timeout 100 if ($avail -eq $false) {write-output "$srv not available"; return $false}


אח"כ נקבל לתוך המשתנה list את הרשימה של כל הלוגים מהמחשב אותם אנו רוצים לקרוא (כברירת מחדל - כולם, אחרת רק מה שקיבלנו בפרמטר)
קוד:
if ($log -match "EverySingleLogAvailable") { $list = $(Get-EventLog -list -computername $srv) | % {write-output $_.Log} } else { $list = $log }


נכין משתנה תאריך שנכון למספר הימים אחורה המבוקשים:
קוד:
$days = -$days $eventdate = (get-date).AddDays($days)


ולסיום: בעבור כל אחד(%) מהלוגים (list$) נפעיל את get-eventlog ללוגים שנוצרו אחרי התאריך המבוקש (eventdate$)
נציג רק events שהID שלהם מתאים לערך שביקשנו (where) ונציג את הevent במלואו (* fl)
קוד:
$list | % {Get-EventLog -computername $srv -log $_ -after $eventdate | where {$_.EventID -eq $EID} | fl *}


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

דוגמה להרצה:
קוד:
> event-seek kobebe-pc 1704 1 application EventID : 1704 MachineName : Kobbebe-PC.coolest.domain Data : {} Index : 16195 Category : (0) CategoryNumber : 0 EntryType : Information Message : Security policy in the Group policy objects has been appli ed successfully. Source : SceCli ReplacementStrings : {} InstanceId : 1073743528 TimeGenerated : 7/18/2012 8:33:32 AM TimeWritten : 7/18/2012 8:33:32 AM UserName : Site : Container :
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

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

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 14:46

הדף נוצר ב 0.06 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר