Wednesday, March 7, 2012
Calcul des Indemnités Kilométriques MAJ IK 2012
Mise à jour des Indices Kilométriques par l'administration. Ceux-ci n'ont pas changé par rapport à ceux de 2010. J'ai cependant modifié mon billet http://franckrichard.blogspot.com/2011/03/calcul-des-indemnites-kilometriques.html et rajouté le fichier excel correspondant.
Wednesday, February 15, 2012
Simple Powershell Password Obfuscation
There is many ways to encrypt password in SHA1, MD5 or any other encrypter in powershell using .NET libraries.
This time, I only need a simple and fast obfuscation powershell encoder/decoder to avoid plain text password. I choose this simple solution:
I encode in decimal letter then I add 1
Ex: A = 41 (byte char in hexadecimal) = 65 (byte char in decimal)
obfuscation add 1 so obfuscation result = 65+1 = 66
obfuscation decoder sub 1 so 66-1 = 65 = A
((download scripts)
to encode
encode result:
to decode
decode result:
Example of obfuscation encoder for your password
result with computer mycomputer, user myuser and password mypasswor;
Example of obfuscation decoder for your password
you need a test file servers.txt using line generated above
This time, I only need a simple and fast obfuscation powershell encoder/decoder to avoid plain text password. I choose this simple solution:
I encode in decimal letter then I add 1
Ex: A = 41 (byte char in hexadecimal) = 65 (byte char in decimal)
obfuscation add 1 so obfuscation result = 65+1 = 66
obfuscation decoder sub 1 so 66-1 = 65 = A
((download scripts)
to encode
$strEncoded = ""
$strToEncode = "ABCD"
$strToEncode.ToCharArray() | Foreach { $strEncoded = $strEncoded + ([BYTE][CHAR]($_)+1) + " " }
Write-Host $strEncoded
encode result:
66 67 68 69
to decode
$strDecoded = ""
$strToDecode = "66 67 68 69"
$strToDecode.Trim().Split(" ") | Foreach { $strDecoded = $strDecoded + [CHAR][BYTE](($_)-1) }
Write-Host $strDecoded
decode result:
ABCD
Example of obfuscation encoder for your password
#
# Simple Password Obfuscation encoder
#
# by Franck RICHARD
# 2012 February
#
$strComputername = Read-Host "Enter Computername"
$username = Read-Host "Enter Username"
$password = read-host "Enter a Password"
# To encode password
$strToEncode = $password
$strEncoded = ""
$strToEncode.ToCharArray() | Foreach { $strEncoded = $strEncoded + ([BYTE][CHAR]($_)+1) + " " }
$line = $strComputername + ";" + $username + ";" + $strEncoded
Write-Host $line
result with computer mycomputer, user myuser and password mypasswor;
Enter Computername: mycomputer Enter Username: myuser Enter a Password: mypassword mycomputer;myuser;110 122 113 98 116 116 120 112 115 101
Example of obfuscation decoder for your password
you need a test file servers.txt using line generated above
mycomputer;myuser;110 122 113 98 116 116 120 112 115 101 mycomputer2;myuser2;111 102 120 113 98 116 116 120 112 115 101
#
# Simple Password Obfuscation decoder
#
# by Franck RICHARD
# 2012 February
#
$strContent = Get-Content servers.txt
Foreach ($strLine in $strContent) {
$strInfos = $strLine.Trim().Split(";")
$strDecoded = ""
$strToDecode = $strInfos[2]
$strToDecode.Trim().Split(" ") | Foreach { $strDecoded = $strDecoded + [CHAR][BYTE](($_)-1) }
Write-Host "Computername:" $strInfos[0] "User:" $strInfos[1] "Password:" $strDecoded
}
Thursday, January 12, 2012
HP SIM 6.3 browser security setting error
An error "Your browser's security settings for the zone it chose for this connection are not compatible with the HP SIM popup menu"
HP Systems Insight Manager v6.3 installation have been done on an Windows 2008 R2. So this is an internet explorer 8. (there are some troubles with internet explorer 9)
And Security options have been set to medium-low.
Same problem with Firefox
SIM63_hotfix_2011_Aug_win.exe have been installed also
Problem is solved with SIM63_hotfix_2011_Oct_win.exe (ftp://ftp.hp.com/pub/softlib2/software1/pubsw-windows/p1002362299/v73061)
HP Systems Insight Manager v6.3 installation have been done on an Windows 2008 R2. So this is an internet explorer 8. (there are some troubles with internet explorer 9)
And Security options have been set to medium-low.
Same problem with Firefox
SIM63_hotfix_2011_Aug_win.exe have been installed also
Problem is solved with SIM63_hotfix_2011_Oct_win.exe (ftp://ftp.hp.com/pub/softlib2/software1/pubsw-windows/p1002362299/v73061)
Tuesday, November 8, 2011
ESX or Linux update Automation for windows users: su root and password
Today, I improved an old post. (I recommend you to read it before this post)
These scripts work correctly but for security reasons I could not use this work. Indeed, we must log before with an user then su in root. Moreover, with these previous scripts, that was not possible to transfert any other files like binaries files. So I decided to work on this problem to avoid to manually update 150 esx.
Sure, some trick exist like "expect" (not included in esx) or cpan perl expect, but it was simpliest to me to improve my scripts.
To use my scripts, just create a file yourfile.zip containing a script yourfile.sh and all needed files
process of these scripts:
script use a computer listing file (here servers.txt file) including all your computers you need to update
Script upload on your esx or linux computers yourfile.zip to /tmp directory, then decompress yourfile.zip and run yourfile.sh file
In update_esx_v2.zip, I give you a script example which permit you to update ESX with 2 patchs
[EDIT 15 february 2012] I re-upload zip file and add some informations in this post
In update.zip, file update.sh script contains all commands to do update
Now, you can run "run_update.cmd" which run your updates with user esxadmin
(only if this user can do all that you want - if user to connect your esx is not esxadmin change line with set usern=esxadmin)
To run your update with user esxadmin then su root
all computers to update are in file servers.txt below
Main script update_esx.vbs that permit to transfert and decompress "yourfile.zip" and execute "yourfile.sh" on your linux or esx
These scripts work correctly but for security reasons I could not use this work. Indeed, we must log before with an user then su in root. Moreover, with these previous scripts, that was not possible to transfert any other files like binaries files. So I decided to work on this problem to avoid to manually update 150 esx.
Sure, some trick exist like "expect" (not included in esx) or cpan perl expect, but it was simpliest to me to improve my scripts.
To use my scripts, just create a file yourfile.zip containing a script yourfile.sh and all needed files
process of these scripts:
script use a computer listing file (here servers.txt file) including all your computers you need to update
Script upload on your esx or linux computers yourfile.zip to /tmp directory, then decompress yourfile.zip and run yourfile.sh file
In update_esx_v2.zip, I give you a script example which permit you to update ESX with 2 patchs
[EDIT 15 february 2012] I re-upload zip file and add some informations in this post
In update.zip, file update.sh script contains all commands to do update
#!/bin/sh # Update cd ESX350-201012404-BG/ esxupdate --nosig update cd .. cd ESX350-201012410-BG/ esxupdate --nosig update cd ..In update.zip, there is also all necessary files used by update.sh
update\ update\update.sh update\ESX350-201012404-BG\ update\ESX350-201012404-BG\contents.xml update\ESX350-201012404-BG\contents.xml.sig update\ESX350-201012404-BG\descriptor.xml update\ESX350-201012404-BG\VMware-esx-scripts-3.5.0-317866.i386.rpm update\ESX350-201012404-BG\headers\ update\ESX350-201012404-BG\headers\contents.xml update\ESX350-201012404-BG\headers\contents.xml.sig update\ESX350-201012404-BG\headers\header.info update\ESX350-201012404-BG\headers\VMware-esx-scripts-0-3.5.0-317866.i386.hdr update\ESX350-201012410-BG\ update\ESX350-201012410-BG\contents.xml update\ESX350-201012410-BG\contents.xml.sig update\ESX350-201012410-BG\descriptor.xml update\ESX350-201012410-BG\vmware-keying-data-1-20100930.noarch.rpm update\ESX350-201012410-BG\headers\ update\ESX350-201012410-BG\headers\contents.xml update\ESX350-201012410-BG\headers\contents.xml.sig update\ESX350-201012410-BG\headers\header.info update\ESX350-201012410-BG\headers\vmware-keying-data-0-1-20100930.noarch.hdr
Now, you can run "run_update.cmd" which run your updates with user esxadmin
(only if this user can do all that you want - if user to connect your esx is not esxadmin change line with set usern=esxadmin)
@echo off set usern=esxadmin set zipfile=update.zip set computerfile=servers.txt if "%1"=="" goto :nopass set password=%1 cscript //nologo update_esx.vbs %computerfile% %zipfile% %usern% %password% goto :eof :nopass echo you need a password for user %usern% goto :eof
To run your update with user esxadmin then su root
@echo off set usern=esxadmin set userroot=root set zipfile=update.zip set computerfile=servers.txt if "%1"=="" goto :nopass if "%2"=="" goto :nopass2 set password=%1 set pwdroot=%2 cscript //nologo update_esx.vbs %computerfile% %zipfile% %usern% %password% %userroot% %pwdroot% goto :eof :nopass echo you need a password for user %usern% goto :eof :nopass2 echo you need a password for user %userroot% goto :eof
all computers to update are in file servers.txt below
computer1 computer2 computer3
Main script update_esx.vbs that permit to transfert and decompress "yourfile.zip" and execute "yourfile.sh" on your linux or esx
'
' update_esx.vbs
'
' by F.RICHARD
'
' v1.00 2007 Nov - Initial release
' v1.01 2008 Jan - Display Standard output
' v2.00 2011 Nov - Modify script to use and send ZIP file
'
Option Explicit
Const ForReading = 1
Const ForWriting = 2
'
' Detect WScript or CScript
'
If InStr(LCase(WScript.FullName), "wscript")>0 Then ' ex: FullName = C:\WINNT\system32\wscript.exe
WScript.Echo "This script must be run under CScript."
WScript.Quit
End If
'
' Get Command Line Args
'
Dim Args
Set Args = Wscript.Arguments
If Args.Count < 4 Then
Wscript.Echo "Syntax : " & WScript.ScriptName & " input_computer_list_file zip_file_to_send_uncompress_and_execute user password"
Wscript.Echo "Syntax : " & WScript.ScriptName & " input_computer_list_file zip_file_to_send_uncompress_and_execute user password [root] [root password]"
Wscript.Echo " Example : cscript " & WScript.ScriptName & " servers.txt myfile.zip user password"
Wscript.Echo " Example : cscript " & WScript.ScriptName & " servers.txt myfile.zip user password root rootpass"
Wscript.Echo ""
Wscript.Echo "computer_list_file: line begin by # or ; indicate start of a comment, everything after is ignored"
Wscript.Echo ""
Wscript.Quit
End If
' Args(0) = computer list
Dim strInputList
strInputList = Trim(args(0))
' Args(1) = zip file to send and execute
Dim strScriptToExecute, strCompressFile, strDirectory, strCompressFileExt
strCompressFile = Trim(args(1))
strCompressFileExt = Right(strCompressFile, Len(strCompressFile)-InStr(1, strCompressFile, ".") )
If (StrComp(strCompressFileExt, "zip", vbTextCompare) <> 0) Then
WScript.Echo "File to send: '" & strCompressFile & "'is not a .zip file"
WScript.Quit
End If
strDirectory = Left(strCompressFile, InStr(1, strCompressFile, ".")-1)
strScriptToExecute = strDirectory & ".sh"
' Args(2) = user
Dim strUser
strUser = Trim(args(2))
' Args(3) = password
Dim strPassword
strPassword = Trim(args(3))
' Args(4) = root name
' Args(5) = root password
Dim strRootPassword, strRootName
If Args.Count > 5 Then
strRootName = Trim(args(4))
strRootPassword = Trim(args(5))
End If
'
' Get Path
'
Dim strScriptFullName, strScriptPath
strScriptFullName = WScript.ScriptFullName ' ex: C:\Program Files\MyFolder\MyProg.exe
strScriptPath = Left(strScriptFullName, InStrRev(strScriptFullName, "\") - 1) ' ex: C:\Program Files\MyFolder
Dim objFso
Set objFso = CreateObject("Scripting.FileSystemObject")
'
' Test If all Files Exist
'
If Not isFileExist(strInputList) Then
strInputList = strScriptPath & "\" & strInputList
If Not isFileExist(strInputList) Then
WScript.Echo "Computer list:" & strInputList & " File Not Exist !"
WScript.Quit
End If
End If
WScript.Echo "Computer list:" & strInputList & " File Exist"
If Not isFileExist(strCompressFile) Then
strCompressFile = strScriptPath & "\" & strCompressFile
If Not isFileExist(strCompressFile) Then
WScript.Echo "Compress file:" & strCompressFile & """" & " File Not Exist !"
WScript.Quit
End If
End If
WScript.Echo "Script to uncompress:" & strCompressFile & " File Exist"
Dim strPlink
strPlink= strScriptPath & "\" & "plink.exe"
If Not isFileExist(strPlink) Then
WScript.Echo "PuTTY Link:" & strPlink & " File Not Exist !"
WScript.Quit
End If
WScript.Echo "PuTTY Link:" & strPlink & " File Exist"
Dim strPscp
strPscp= strScriptPath & "\" & "pscp.exe"
If Not isFileExist(strPscp) Then
WScript.Echo "PuTTY Secure Copy client:" & strPscp & " File Not Exist !"
WScript.Quit
End If
WScript.Echo "PuTTY Secure Copy client:" & strPscp & " File Exist"
Dim objShell, ComSpec
Set objShell = CreateObject( "WScript.Shell" )
ComSpec=objShell.ExpandEnvironmentStrings("%ComSpec%")
'
' Read computer list file into dictionary
'
Dim objDictionary, return
return = ReadFileToDict(strInputList, objDictionary)
If return = 0 Then
WScript.Echo "Error during computer list file read"
WScript.Quit
End If
'
' Generate .sh file to execute
'
Dim strContent, strScriptToDecFile
strScriptToDecFile = "decfile.sh"
strContent = "#!/bin/sh" & vbLf & _
"# Unzip " & strCompressFile & " then enter in " & strDirectory & " directory and execute " & strScriptToExecute & " file" & vbLf & _
"cd /tmp" & vbLf & _
"unzip -o " & strCompressFile & vbLf
return = WriteStrToFile(strScriptToDecFile, strContent)
' Display file
Dim objItem, strServer, objCmd, strCmdline, continue, strGenerateKey
For Each objItem in objDictionary
strServer = objDictionary.Item(objItem)
Wscript.Echo ""
WScript.Echo "Server:" & strServer
' Test Connection
strCmdline = ComSpec & " /c """ & strPlink & """ -batch -C -pw " & strPassword & " " & strUser & "@" & strServer & " pwd "
strGenerateKey = ComSpec & " /c echo y | """ & strPlink & """ " & strServer & " -pw " & strPassword & " " & strUser
WScript.Echo "Test Connection on server " & strServer
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
If (return > 0) Then
strGenerateKey=""
Do
WScript.Echo "Re-verify Connection on server " & strServer
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
Loop While (return > 0 and return < 255)
If (return > 0) Then
WScript.Echo "Transfer " & strScriptToDecFile & " script on server " & strServer
strCmdline = ComSpec & " /c """ & strPscp & """ -batch -C -pw " & strPassword & " " & strScriptToDecFile & " " & strUser & "@" & strServer & ":/tmp"
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
WScript.Echo "Transfer " & strCompressFile & " script on server " & strServer
strCmdline = ComSpec & " /c """ & strPscp & """ -batch -C -pw " & strPassword & " " & strCompressFile & " " & strUser & "@" & strServer & ":/tmp"
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
WScript.Echo "Execute " & strScriptToDecFile & " script on server " & strServer
strCmdline = ComSpec & " /c """ & strPlink & """ -batch -C -pw " & strPassword & " " & strUser & "@" & strServer & " " & "cd /tmp; sh " & strScriptToDecFile
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
' if root / or not root
If Args.Count > 5 Then
objShell.Run "putty.exe -ssh " & strUser & "@" & strServer
WScript.Sleep 5000
objShell.AppActivate strServer & " - PuTTY"
WScript.Sleep 5000
objShell.SendKeys "" & strPassword & "{ENTER}"
WScript.Sleep 5000
objShell.SendKeys "su - " & strRootName & "{ENTER}"
WScript.Sleep 5000
objShell.SendKeys "" & strRootPassword & "{ENTER}"
WScript.Sleep 5000
objShell.SendKeys "cd /tmp/" & strDirectory & "; sh " & strScriptToExecute & "{ENTER}"
WScript.Sleep 5000
Else
WScript.Echo "Execute " & strScriptToExecute & " script on server " & strServer
strCmdline = ComSpec & " /c """ & strPlink & """ -batch -C -pw " & strPassword & " " & strUser & "@" & strServer & " " & "cd /tmp/" & strDirectory & "; sh " & strScriptToExecute
return = DoConnection(strCmdline, strGenerateKey, strServer, True)
End If
End If
End If
Next
'
' Quit
'
WScript.Sleep 1000
WScript.Quit
'--------------------
' DoConnection
'
'
'
Function DoConnection(strCmdline, strGenerateKey, strServer, displayLogfile)
Dim objCmd, return, Continue
'WScript.Echo "cmdline->" & strCmdline
Set objCmd = objShell.Exec(strCmdline)
Do While objCmd.Status = 0
return = objCmd.stdErr.ReadAll
WScript.Sleep 100
Loop
If (displayLogfile) Then
Dim strStdOut
strStdOut = objCmd.StdOut.ReadAll()
If (len(strStdOut) > 0) Then
Wscript.Echo strStdOut
End If
End If
continue = 0
If Instr(return, "Access denied" ) > 0 Then ' Access denied
WScript.Echo "ERROR on server " & strServer & vbCrLf & return
continue = 0
Elseif Instr(return, "Unable to open connection" ) > 0 Then ' Unable to open connection
WScript.Echo "ERROR on server " & strServer & vbCrLf & return
continue = 0
Elseif Instr(return, "ERROR" ) > 0 Then ' FATAL ERROR: Network error: Connection timed out
WScript.Echo "ERROR on server " & strServer & vbCrLf & return
continue = 0
Elseif Instr(return, "fingerprint" ) > 0 Then
If (len(strGenerateKey) > 2) Then
WScript.Echo "GENERATE key fingerprint on server " & strServer
'WScript.Echo "generatekey->" & strGenerateKey
objShell.Exec(strGenerateKey)
continue = 1
Else
WScript.Echo "NOT GENERATE key fingerprint " & strServer
continue = 2
End If
Else
continue = 255
'WScript.Echo "Logged on " & strServer & " - " & return
End if
DoConnection = continue
End Function
'--------------------
' isFileExist
'
' Test if File Exist
'
Function IsFileExist(strInputFile)
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FileExists(strInputFile) Then
Wscript.echo strInputFile & " file not exist !"
IsFileExist = False
Else
IsFileExist = True
End If
End Function
'--------------------
' ReadFileToDict
'
' Read each line -> put in Dictionary
' strInputfile = file to read
' objDictionary = dictionary for results
'
Function ReadFileToDict(strInputFile, ByRef objDictionary)
Dim objFSO, objTextFile, strNextLine, i
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objFSO = CreateObject("Scripting.FileSystemObject")
If isFileExist(strInputFile) Then
Set objTextFile = objFSO.OpenTextFile(strInputFile, ForReading)
i = 0
Do Until objTextFile.AtEndOfStream
strNextLine = Trim(objTextFile.Readline)
If ( (Not Left(strNextLine, 1) = "#") _
and (Not Left(strNextLine, 1) = ";") _
and (Len(strNextLine)>1) _
) Then
objDictionary.Add i, strNextLine
i = i + 1
End If
Loop
objTextFile.Close
ReadFileToDict = True
Else
ReadFileToDict = False
End If
End Function
'--------------------
' WriteStrToFile
'
' Write string to file
' strOutputFile = file to write
' strContent = string to write
'
Function WriteStrToFile(strOutputFile, ByRef strContent)
Dim objFSO, objTextFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile(strOutputFile, True) ' delete file
objTextFile.Write(strContent)
objTextFile.Close
End Function
'--------------------
Thursday, August 4, 2011
Check your Onboard Administrator / Virtual Connect password
If you want to check your Onboard Administrator / Virtual Connect password, or test some passwords, because you don't really remember the real good one, I modified my previous script Plink_reg.cmd to make work for you.
For this, just change line 43 to 47 in file Plink_reg.cmd (or download TestOAVCPass.zip)
with these lines
For example, to test password password1,password2,password3 and password4 in oa or vc with ip address 192.1.1.100 use a file "myipass.txt" with these entries:
Run "TestOAVCPass.exe myipass.txt" then you should have result like below (here password3 is the good oa password)
For this, just change line 43 to 47 in file Plink_reg.cmd (or download TestOAVCPass.zip)
Echo Reg plink %1 (%date% %time%)
Echo ----------------------------- >> %LOGFILE% 2>>&1
Echo Reg plink %1 (%date% %time%) >> %LOGFILE% 2>>&1
plink.exe -ssh -l %2 -pw %3 -batch %1 "exit" >> %LOGFILE% 2>>&1
goto :EOF
with these lines
Echo Reg plink %1 (%date% %time%)
Echo ----------------------------- >> %LOGFILE% 2>>&1
Echo Reg plink %1 (%date% %time%) %2 %3 >> %LOGFILE% 2>>&1
plink.exe -ssh -l %2 -pw %3 -batch %1 "exit" > temp.txt 2>>&1
set passok=PASSWORD_KO
type temp.txt | findstr /i denied
if errorlevel 1 set passok=PASSWORD_IN_THIS_LINE
Echo ;%date% %time%;%1;%2;%3;%passok% >> resultpass.txt
goto :EOF
For example, to test password password1,password2,password3 and password4 in oa or vc with ip address 192.1.1.100 use a file "myipass.txt" with these entries:
192.1.1.100;manager;password1
192.1.1.100;manager;password2
192.1.1.100;manager;password3
192.1.1.100;manager;password4
Run "TestOAVCPass.exe myipass.txt" then you should have result like below (here password3 is the good oa password)
;31/07/2011 12:23:07,26;192.1.1.100;manager;password1;PASSWORD_KO
;31/07/2011 12:23:10,10;192.1.1.100;manager;password2;PASSWORD_KO
;31/07/2011 12:23:11,49;192.1.1.100;manager;password3;PASSWORD_IN_THIS_LINE
;31/07/2011 12:23:13,94;192.1.1.100;manager;password4;PASSWORD_KO
Saturday, July 2, 2011
Check your ip/computername with nslookup in powershell
Nslookup is a great tool for testing and troubleshooting. However, if you need to check a large range of IP/Computername in mass, nslookup is not the better choice. So, this below script could help you to do the same in powershell. (Download script)
Example of Result:
#
# NSLookup
#
# by F.Richard 2011-05
#
# ***********************************************
Function NSlookup {
Param($hostname)
#$iphostEntry = [System.Net.Dns]::GetHostEntry($hostname)
# Rexolve obsolete but better than GetHostEntry
$iphostEntry = [System.Net.Dns]::Resolve($hostname)
$line = $iphostEntry.HostName
$strSeparator = ";"
foreach ($addr in $iphostEntry.AddressList) {
$line = $line + $strSeparator + $Addr.IPAddressToString
$strSeparator = "|"
}
$strSeparator = ";"
foreach ($alias in $iphostEntry.aliases) {
$line = $line + $strSeparator + $alias
$strSeparator = "|"
}
return $line
}
# ***********************************************
Function TestFile {
Param(
[String] $strFilename,
[String] $strCurDir
)
if ($strFilename) {
$strCurDir = $(if ($strCurDir) {$strCurDir} else {if ($MyInvocation.MyCommand.CommandType -eq "Function") {(Get-Location).Path} else {Split-Path -parent $MyInvocation.MyCommand.Path} })
If ((Test-Path("$strFilename")) -eq $False){
If ($strFilename.ToUpper().Contains($strCurDir.ToUpper()) ) {
Write-Host "ERROR: file $strFilename NOT exist"
return
} Else {
If ((Test-Path("$strCurDir\$strFilename")) -eq $False){
Write-Host "ERROR: file $strFilename NOT exist"
Write-Host "ERROR: file $strCurDir\$strFilename NOT exist"
return
} Else {
$strFilename = "$strCurDir\$strFilename"
}
}
}
return $strFilename
}
}
# ***********************************************
Function GetFileIntoArr {
Param(
[String] $strFilename,
[String] $strCurDir,
[Ref]$arrFile,
[String] $strComment
)
$strComment = $(if ($strComment) {$strComment} else {"#"})
$strCurDir = $(if ($strCurDir) {$strCurDir} else {if ($MyInvocation.MyCommand.CommandType -eq "Function") {(Get-Location).Path} else {Split-Path -parent $MyInvocation.MyCommand.Path} })
$retFilename = TestFile -strFilename $strFilename -strCurDir $strCurDir
if ($retFilename) {
$Content = Get-Content "$retFilename"
Foreach ($line in $Content) {
$comment = $False
If ($line.Trim().length -gt 0) { # take only line with data and without # at begininng of the line
# if we do not want to use comment
If ($strComment -eq "#") {
If ($line.substring(0,1) -eq "#") {
$comment = $True
}
}
If ($comment -eq $False) {
# Get Search & Replace
$arrFile.Value += $line.Trim()
}
}
}
return $True
} else {
return $False
}
}
# ***********************************************
#
# MAIN PROGRAM
#
# Verify Arguments Number
If($Args.Count -lt 2) {
Write-Host "Syntax:"$MyInvocation.MyCommand.Name "inputfilename outputfilename"
Write-Host " Example:"$MyInvocation.MyCommand.Name" 'inputfile.txt' 'outputfile.txt' "
Write-Host " Example:"$MyInvocation.MyCommand.Name" -inputfile 'inputfile.txt' -outputfile 'outputfile.txt' "
Write-Host
Break
}
$inputfile = $args[0]
$outputfile = $args[1]
$date = get-date -format "yyyy-MM-dd"
$Content = "#Date;Computer;Hostname;IP`r`n"
$Content | Out-File -encoding ASCII $outputfile
[Array] $arrComputers = @( )
if ($inputfile) {
if (!(GetFileIntoArr -strFilename $inputfile -arrFile ([Ref]$arrComputers))) {
Break
}
} else {
Write-Host "ERROR: you need a filename.txt as second parameter inputfile"
Break
}
Foreach ($computer in $arrComputers) {
$nslookup = NSlookup($computer)
$line = $date + ";" + $computer + ";" + $nslookup
#+ "`r`n"
Write-Host $line
$line | Out-File -append -encoding ASCII $outputfile
}
Example of Result:
#Date;Computer;Hostname;IP
2011-06-01;COMPUTER1;computer1.dns1.my.net;192.1.1.45;COMPUTER1.dns2.my.net
2011-06-01;COMPUTER2;COMPUTER2.si.net;192.1.1.100
2011-06-01;COMPUTER3;COMPUTER3.si.net;192.1.1.101
2011-06-01;COMPUTER4;COMPUTER4.si.net;192.1.102
Wednesday, June 29, 2011
Find your VMware local VMFS datastore with powershell
To find your local VMFS datastore
Solution 1: name all your local vmfs LOCAL_xxx
Get all your local datastore by using
Solution 2: use MultipleHostAccess info from Get-Datastore
(Thanks to http://blogs.vmware.com/vipowershell/2009/08/how-to-list-datastores-that-are-on-shared-storage.html?cid=6a00d8341c328153ef0120a52e7f0b970b for MultipleHostAccess tip)
You can use this:
Solution 3: use Vendor / Model SCSILun informations from VMHost get-view
Hostname Model Vendor
-------- ----- ------
esx01 LOGICAL VOLUME HP
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx02 RAID 5 DGC
esx02 SYMMETRIX EMC
esx02 SYMMETRIX EMC
esx02 RAID 5 DGC
esx03 LOGICAL VOLUME HP
esx03 2810XIV IBM
esx03 2810XIV IBM
esx03 2810XIV-LUN-0 IBM
esx03 2810XIV IBM
Example of SAN vendor/model
Vendor / Model
VMware / Block device
EMC / SYMMETRIX
IBM / 2810XIV
Example of Local storage
Vendor / Model
HP / LOGICAL VOLUME
DGC / RAID 5
Solution 1: name all your local vmfs LOCAL_xxx
Get all your local datastore by using
Get-Datastore | Get-View | Where-Object { $_.Name -match "LOCAL_*" } | Select-Object @{n="Name";e={$_.Name}}}
Name
----
LOCAL_ESX01
LOCAL_ESX02
LOCAL_ESX03
Solution 2: use MultipleHostAccess info from Get-Datastore
(Thanks to http://blogs.vmware.com/vipowershell/2009/08/how-to-list-datastores-that-are-on-shared-storage.html?cid=6a00d8341c328153ef0120a52e7f0b970b for MultipleHostAccess tip)
You can use this:
Get-Datastore | Get-View | Select-Object @{n="Name";e={$_.Name}}, @{n="San_Nas";e={$_.Summary.MultipleHostAccess}}
Name San_Nas
---- -------
NFS_VOL2 True
LOCAL_ESX01 False
NFS_VOL1 True
LOCAL_ESX02 False
LOCAL_ESX03 False
Solution 3: use Vendor / Model SCSILun informations from VMHost get-view
Get-VMHost | Get-View | Foreach-Object { $vmhost=$_.Name; $_.Config.StorageDevice.ScsiLun | Select-Object @{n="Hostname";e={$vmhost}},@{n="Model";e={$_.Model}},@{n="Vendor";e={$_.Vendor}} }
Hostname Model Vendor
-------- ----- ------
esx01 LOGICAL VOLUME HP
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx01 SYMMETRIX EMC
esx02 RAID 5 DGC
esx02 SYMMETRIX EMC
esx02 SYMMETRIX EMC
esx02 RAID 5 DGC
esx03 LOGICAL VOLUME HP
esx03 2810XIV IBM
esx03 2810XIV IBM
esx03 2810XIV-LUN-0 IBM
esx03 2810XIV IBM
Example of SAN vendor/model
Vendor / Model
VMware / Block device
EMC / SYMMETRIX
IBM / 2810XIV
Example of Local storage
Vendor / Model
HP / LOGICAL VOLUME
DGC / RAID 5
Subscribe to:
Posts (Atom)

