Question Fonction - Get-MACVendor

Plus d'informations
il y a 15 ans 9 mois #7069 par Alan Pinard
Bonjour,

Voici une fonction qui vous retourne le manufacturier selon une adresse MAC.

Pour ce faire, j'intéroge le site Web www.coffer.com/mac_find

[code:1]
Function Get-MACVendor {

PARAM (
$Mac = (Read-Host \"Enter the Mac address with `\"-`\" or `\":`\" separator\"«»)
)
If($Mac.Contains(\"-\"«»)){
$MACRequest = ($MAC.Replace(\"-\",\"%3A\"«»))
} Else{
$MACRequest = ($MAC.Replace(\":\",\"%3A\"«»))
}

$MACRequest = $MACRequest.Insert(0,\"?string=\"«»)
$URL = \"www.coffer.com/mac_find/\"; + $MACRequest
$Result = (New-Object Net.WebClient).DownloadString($URL).ToString()

$RegEx=[ReGex]::Matches($Result, 'google\.com/search.*\">(.*)</a.*', [Text.RegularExpressions.RegexOptions]::MultiLine)
$RegEx[0].groups[1].value
Return $FinalResult
}
[/code:1]

Alan Pinard
Version A

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7070 par Laurent Dardenne
Belle fonction ;)
Qq soucis dans le code :
- $FinalResult n'existe pas,
- l'appel du web peut ne rien renvoyer :

Description . . . . . . . . . . . : Carte de bouclage Microsoft
Adresse physique . . . . . . . . .: 02-00-4C-4F-4F-50

- On peut passer un nom de fabricant, dans ce cas le web peut renvoyer 0 ou n lignes, un filtre sur le format est nécessaire si tu veux uniquement interroger sur une adresse MAC
- pour info, on peut aussi utiliser une url de ce type :
[code:1]www.coffer.com/mac_find/?string=08:00:69:02:01:FC[/code:1]
-le fait d'utiliser un read-host restreint l'usage de cette fonction à la console, un job ne pourra pas l'utiliser si on ne fournit aucun paramètre ( ce n'est peut être pas l'objectif...)
-On peut saisir une chaine vide(\"\") ou $null.
-le serveur peut être off-line.

Bref, il manque qq contrôles pour en faire une fonction plus robuste. Une fonction avancée peut, je pense, régler la pluspart de ces petits soucis.

Et sinon WMI ne pouvait pas te donner l'info ?

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7075 par Laurent Dardenne
Une possible amélioration :
[code:1]
Function Get-MacAddressVendor {
Param (
[Parameter(Position=0,
Mandatory=$true,
ValueFromPipelineByPropertyName = $true,
#Si l'objet ne contient pas de propriété Mac/MacAddress ou si son contenue est $null
# le binding se fait la valeur renvoyée par l'appel de ToString sur l'objet courant.
ValueFromPipeline = $true,
HelpMessage='Enter the Mac address with \"-\" or \":\" separator')]
[ValidateNotNullOrEmpty()]
[Alias(\"MACAddress\",\"AdresseMac\",\"PhysicalAddress\"«»)]
[string]$Mac
)
Begin {
$WebSite=\"www.coffer.com\"
if (!(Test-Connection $WebSite -Count 1 -Quiet))
{ Throw \"Problème d'accès au site $WebSite\" }
$WebClient=New-Object Net.WebClient
}
Process {
#regex :
# on recherche, en début de chaîne, 5 occurrences qui se suivent de deux chiffres en hexadécimal suivi du caractère ':',
# ce groupe de 5 occurrences doit lui même être suivi de deux chiffres en hexadécimal situés en fin de chaîne.
#on recherche ce type de format pour les constructions avec le caractère ':' ou \"-\"
if (!($Mac -match '^([0-9a-f]{2}:«»){5}([0-9a-f]{2})$|^([0-9a-f]{2}-){5}([0-9a-f]{2})$'))
{
#L'usage de l'attribut ValidatePattern ne renvoi
# pas un message d'erreur suffisamment explicite.
Write-Error \"Format d'adresse incorrect pour $Mac\";return
}
Try {
$DownloadedString= $WebClient.DownloadString(\"www.coffer.com/mac_find/?string=$Mac\"«»)
}Catch {
Write-Error \"Echec de la récupération d'informations sur le site $WebSite\";return
}
$RegEx=[Regex]::Matches($DownloadedString, 'google\.com/search.*\">(.*)</a.*', [Text.RegularExpressions.RegexOptions]::MultiLine)
if ($RegEx.Count -ne 0)
{New-Object PSCustomObject -property @{Name=$RegEx[0].Groups[1].value;Mac=$Mac}}
elseif ($RegEx.Count -gt 1)
{ Throw \"Cas non géré, il existe plusieurs réponses pour l'adresse $Mac\"}
else
{Write-Error \"Vendeur introuvable pour '$($Mac)'\";return}
}
End {
if ($WebClient)
{$WebClient.Dispose() }
}
}
[/code:1]
La fonction précédente évite le pb d'exécution au sein d'un job, on utilisera donc cette seconde fonction pour lire le paramètre à partir du clavier:
[code:1]
Function Read-MacAddressVendor{
#Force la lecture du paramètre $MacAddress s'il n'est pas renseigné
Param (
[string] $MacAddress
)
if ([String]::IsNullOrEmpty($MacAddress))
{ $MacAddress=Read-Host 'Enter the Mac address with \"-\" or \":\" separator' }
Get-MacAddressVendor $MacAddress
}
[/code:1]
Quelques tests sur le format de l'adresse mac :
[code:1]
#test de la regex
[string[]] $McAdr=@(
\"02-00-4C-4F-4F-50\",
\"02-00-4c-4F-4f-50\",
\"02:00-4C-4F-4F-50\",
\"02-00-4C-4F-4F-5\",
\"02-00-4C-4F-4F-505\",
\"02:00:4C:4F:4F:50\",
\"02:00:4c:4f:4f:50\",
\"02:00:4C:4F:4F-50\",
\"02-00-4C-4F-4F-50-5\",
\"-02-00-4C-4F-4F-50\",
\"cisco\",
\"02:gh:4C:4F:4F:50\",
\"02:0h:4c:4F:4F:50\",
\"02-0h-4c-4F-4F-50\",
\"08:00:69:02:01:FC\"
\"\",
$null)
$McAdr| Get-MacAddressVendor
[/code:1]
Comme on utilise une fonction avancée, on peut utiliser le pipe et les paramètres commun :
[code:1]
#test avec des données de WMI
gwmi Win32_NetworkAdapter|
Get-MacAddressVendor -ea \"SilentlyContinue\"|
Select Name,Mac -unique

#On s'assure du binding sur le champ MAcAddress
gwmi Win32_NetworkAdapter|
Foreach { Get-MacAddressVendor $_.MAcAddress}

#En filtrant les champs MAcAddress $null, on évite la conversion,
# par ValueFromPipeline, de l'objet en string.Ce qui ici provoquera tjr une erreur
gwmi Win32_NetworkAdapter|
Where {$_.MAcAddress -ne $null}|
Get-MacAddressVendor
[/code:1]
On test avec une autre source, cette fois-ci dotnet :
[code:1]
#test avec des données du framework dotnet
[System.Net.NetworkInformation.NetWorkInterface]::GetAllNetworkInterfaces()|
#modifie la chaîne '08002700F092' en '08-00-27-00-F0-92'
Foreach {$_.GetPhysicalAddress() -replace \"(.){2}(?=.)\",\"$&-\"}|
Get-MacAddressVendor


# \"(.){2}(?=.)\",\"$&-\"
# remplace chaque occurence de paire de caractères par elle même sauf la dernière.
# (.){2} indique une paire de caractères,
# (?=.) indique qu'on recherche toutes les paires de caractères suivi d'un caractére, ( i.e. sauf le dernier),
# le caractère testé n'est pas capturé.
# $& indique l'occurence trouvée à insérer dans la chaîne de remplacement, suivi du caractère '-'.
[/code:1]
On a tjr des erreurs, mais avec cette approche on en connait les raisons.<br><br>Message édité par: Laurent Dardenne, à: 5/06/10 17:07

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7081 par Arthur
Réponse de Arthur sur le sujet Re:Fonction - Get-MACVendor
Je me disais bien qu'il y avait plus simple.
[code:1]$carte = Get-WmiObject Win32_NetworkAdapter
PS D:\toto\Scripts&gt; $carte | foreach { write-host \&quot;Nom de la carte : $($_.productname) , Nom du frabriquant : $($_.man
ufacturer) \&quot; }
Nom de la carte : Carte asynchrone RAS , Nom du frabriquant :
Nom de la carte : Miniport réseau étendu (L2TP) , Nom du frabriquant : Microsoft
Nom de la carte : Miniport réseau étendu (PPTP) , Nom du frabriquant : Microsoft
Nom de la carte : Miniport WAN (PPPOE) , Nom du frabriquant : Microsoft
Nom de la carte : Parallèle direct , Nom du frabriquant : Microsoft
Nom de la carte : Miniport réseau étendu (IP) , Nom du frabriquant : Microsoft
Nom de la carte : Miniport d'ordonnancement de paquets , Nom du frabriquant : Microsoft
Nom de la carte : Broadcom NetXtreme 57xx Gigabit Controller , Nom du frabriquant : Broadcom
Nom de la carte : Miniport d'ordonnancement de paquets , Nom du frabriquant : Microsoft
Nom de la carte : VMware Virtual Ethernet Adapter for VMnet1 , Nom du frabriquant : VMware, Inc.
Nom de la carte : VMware Virtual Ethernet Adapter for VMnet8 , Nom du frabriquant : VMware, Inc.
[/code:1]

Enfin le code reste super intéressant.
Car ce n'est pas dit que le fabriquant soit toujours écris dans les objets WMI et c'est un bel exemple pour la récupération d'une page web.<br><br>Message édité par: bilbao, à: 7/06/10 16:26

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7087 par Laurent Dardenne
bilbao écrit:

Je me disais bien qu'il y avait plus simple.

C'est vrai, mais il y a peut être un piège :
[code:1]
Get-MacAddressVendor 00:18:F3:EB:06:A5
# Name Mac
# ---- ---
# ASUSTek COMPUTER INC. 00:18:F3:EB:06:A5

(gwmi Win32_NetworkAdapter|select manufacturer,macaddress|group macaddress)[6].group
# manufacturer macaddress
#

# Marvell 00:18:F3:EB:06:A5
# Microsoft 00:18:F3:EB:06:A5
# Sun Microsystems, Inc. 00:18:F3:EB:06:A5
[/code:1]
Ici (fr.wikipedia.org/wiki/Adresse_MAC) l' Organizationally Unique Identifier est bien attribué à Asustek, la carte utilise un pilote Marvell.
Outre la possible ambiguïté US entre vendor et manufacturer (vendeur/fabricant ?) WMI renvoi beaucoup plus d'entrées que l'appel à [System.Net.NetworkInformation.NetWorkInterface]::GetAllNetworkInterfaces.

L'appel Web renvoi la bonne information, mais n'a pas je pense la même interprétation de l'information (NetworkAdapter vs NetworkInterface).
En passant j'ai aussi le cas avec l'install de VirtualBox.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7098 par Alan Pinard
Réponse de Alan Pinard sur le sujet Re:Fonction - Get-MACVendor
Bonjour à tous,

Merci d'avoir commenter le code. Laurent à raison, j'ai peut-être écrit le code un peu vite:blush: .

Je crois aussi que j'aurais du y mettre des contrôles. Je tenterai à l'avenir d'être plus rigoureux dans la création de scripts/fonctions.

Merci à vous,

Alan Pinard
Version A

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.054 secondes
Propulsé par Kunena