196 lines
4.4 KiB
PowerShell
196 lines
4.4 KiB
PowerShell
#
|
|
# Common.ps1
|
|
#
|
|
|
|
# Override the built-in cmdlet with a custom version
|
|
function Write-ErrorMsg($message) {
|
|
[Console]::ForegroundColor = 'red'
|
|
Write-Output $message
|
|
[Console]::ResetColor()
|
|
}
|
|
|
|
function Convert-ByteArrayToHex {
|
|
[cmdletbinding()]
|
|
param(
|
|
[parameter(Mandatory=$true)]
|
|
[Byte[]]
|
|
$bytes
|
|
)
|
|
#$hexString = [System.Text.StringBuilder]::new($bytes.Length * 2)
|
|
$hexString = New-Object System.Text.StringBuilder($bytes.Length * 2)
|
|
ForEach($byte in $bytes){
|
|
$hexString.AppendFormat("{0:x2}", $byte) | Out-Null
|
|
}
|
|
$hexString.ToString()
|
|
}
|
|
|
|
function Convert-HexToByteArray {
|
|
[cmdletbinding()]
|
|
param(
|
|
[parameter(Mandatory=$true)]
|
|
[String]
|
|
$hexString)
|
|
# $bytes = [byte[]]::new($hexString.Length / 2)
|
|
$bytes = New-Object byte[]($hexString.Length / 2)
|
|
For($i=0; $i -lt $hexString.Length; $i+=2){
|
|
$bytes[$i/2] = [convert]::ToByte($hexString.Substring($i, 2), 16)
|
|
}
|
|
$bytes
|
|
}
|
|
|
|
function Build-SharesMessage {
|
|
param(
|
|
[string] $lniata,
|
|
[string] $message)
|
|
$bytes = Convert-HexToByteArray($lniata);
|
|
#TODO: add message to LNIATA
|
|
$bytes
|
|
}
|
|
|
|
function IsPortOpen {
|
|
param(
|
|
[parameter(Mandatory=$true)]
|
|
[string]
|
|
$hostName,
|
|
[parameter(Mandatory=$true)]
|
|
[int]
|
|
$port,
|
|
[parameter(Mandatory=$false)]
|
|
[int]
|
|
$timeout = 5000)
|
|
|
|
$result = $null
|
|
|
|
# REMOVED: TCPClient's ConnectAsync not available in older powershell
|
|
# $client = New-Object System.Net.Sockets.TCPClient
|
|
# $timeout =
|
|
# $isOpen = $client.ConnectAsync($hostName, $port).Wait($timeout)
|
|
|
|
$client = New-Object System.Net.Sockets.TCPClient
|
|
$isOpen = $false
|
|
try {
|
|
$asyncResult = $client.BeginConnect($hostName, $port, $null, $null)
|
|
if (!$asyncResult.AsyncWaitHandle.WaitOne($timeout, $false))
|
|
{
|
|
throw [System.TimeoutException]::new();
|
|
}
|
|
$client.EndConnect($asyncResult) | Out-Null
|
|
$isOpen = $client.Connected
|
|
}
|
|
catch {
|
|
$isOpen = $false
|
|
}
|
|
finally {
|
|
$client.Close();
|
|
}
|
|
|
|
if ($isOpen) {
|
|
$result = "Success"
|
|
}
|
|
else {
|
|
$result = "Fail"
|
|
}
|
|
"$($result): $($hostName):$($port)"
|
|
}
|
|
|
|
function Send-UdpDatagram {
|
|
Param (
|
|
[string] $ip,
|
|
[int] $port)
|
|
$address = [System.Net.IPAddress]::Parse($ip)
|
|
$endPoints = New-Object System.Net.IPEndPoint($address, $port)
|
|
$socket = New-Object System.Net.Sockets.UDPClient
|
|
#$data = [Text.Encoding]::ASCII.GetBytes($message)
|
|
$data = Build-SharesMessage("ba0252fe");
|
|
#$sendMessage = $socket.Send($data, $data.Length, $endPoints)
|
|
$socket.Send($data, $data.Length, $endPoints) > $null
|
|
$Socket.Close()
|
|
}
|
|
|
|
function Read-Hosts-File-To-Hash {
|
|
Param (
|
|
[string] $fileName,
|
|
[switch] $includeCommentedLines)
|
|
|
|
$hostHash = @{}
|
|
if (-not (Test-Path -Path $fileName)) {
|
|
Write-ErrorMsg "Error: file not found: $($fileName)"
|
|
return $null
|
|
}
|
|
# $lines = Get-Content -Path $fileName
|
|
$lines = [IO.File]::ReadAllLines($fileName)
|
|
foreach ($line in $lines) {
|
|
$line = $line.Trim()
|
|
$isCommented = $false
|
|
if ($line.Length -lt 7) {
|
|
continue
|
|
}
|
|
$chars = $line.ToCharArray()
|
|
if ($chars[0] -eq '#') {
|
|
if (-not $includeCommentedLines) {
|
|
continue
|
|
}
|
|
$isCommented = $true
|
|
}
|
|
$line = $line.Trim('#')
|
|
if ($line.Length -lt 7) {
|
|
continue
|
|
}
|
|
$ix = $line.IndexOf('#')
|
|
if ($ix -gt 0) {
|
|
if ($ix -lt 7) {
|
|
continue
|
|
}
|
|
$line = $line.Substring(0, $ix)
|
|
}
|
|
$words = ($line -split ' ')
|
|
$ip = $words[0]
|
|
try {
|
|
[IPAddress]$ip > $null
|
|
}
|
|
catch {
|
|
continue
|
|
}
|
|
if ($isCommented) {
|
|
$hostHash.Add($ip, $null)
|
|
continue
|
|
}
|
|
if ($words.Count -eq 1) {
|
|
continue
|
|
}
|
|
$names = New-Object System.Collections.Generic.List[String]
|
|
for ($i = 1; $i -lt $words.Count; ++$i) {
|
|
$word = $words[$i].Trim()
|
|
if ($word) {
|
|
$names.Add($words[$i])
|
|
}
|
|
}
|
|
if ($hostHash.ContainsKey($ip)) {
|
|
foreach ($name in $names) {
|
|
$hostHash[$ip].Add($name)
|
|
}
|
|
}
|
|
else {
|
|
$hostHash.Add($ip, $names)
|
|
}
|
|
}
|
|
$hostHash
|
|
}
|
|
|
|
$workingDir = Get-Location
|
|
$uaHostsFileName = Join-Path -Path $workingDir -ChildPath 'ua_hosts.txt'
|
|
$hostsFileName = "$($Env:windir)\system32\drivers\etc\hosts"
|
|
if (Test-Path -Path $uaHostsFileName) {
|
|
$ipHashTable = Read-Hosts-File-To-Hash $uaHostsFileName $true
|
|
$uaHostHashTable = Read-Hosts-File-To-Hash $uaHostsFileName $false
|
|
} else {
|
|
Write-ErrorMsg "UA host entry file missing: $uaHostsFileName"
|
|
$ipHashTable = $null
|
|
$uaHostHashTable = $null
|
|
}
|
|
if (Test-Path -Path $hostsFileName) {
|
|
$hostHashTable = Read-Hosts-File-To-Hash $hostsFileName.ToString() $false
|
|
} else {
|
|
Write-ErrorMsg "System hosts file missing: $hostsFileName"
|
|
$hostHashTable = $null
|
|
} |