Question Fonction - Get-MACVendor
- Alan Pinard
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 77
- Remerciements reçus 0
il y a 15 ans 9 mois #7069
par Alan Pinard
Alan Pinard
Version A
Fonction - Get-MACVendor a été créé 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]
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 9 mois #7070
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Fonction - Get-MACVendor
Belle fonction 
Qq soucis dans le code :
- $FinalResult n'existe pas,
- l'appel du web peut ne rien renvoyer :
- 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 ?
Qq soucis dans le code :
- $FinalResult n'existe pas,
- l'appel du web peut ne rien renvoyer :
- 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 MACDescription . . . . . . . . . . . : Carte de bouclage Microsoft
Adresse physique . . . . . . . . .: 02-00-4C-4F-4F-50
- 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 9 mois #7075
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Fonction - Get-MACVendor
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
[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.
- Arthur
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
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> $carte | foreach { write-host \"Nom de la carte : $($_.productname) , Nom du frabriquant : $($_.man
ufacturer) \" }
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
[code:1]$carte = Get-WmiObject Win32_NetworkAdapter
PS D:\toto\Scripts> $carte | foreach { write-host \"Nom de la carte : $($_.productname) , Nom du frabriquant : $($_.man
ufacturer) \" }
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 9 mois #7087
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Fonction - Get-MACVendor
bilbao écrit:
[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.
C'est vrai, mais il y a peut être un piège :Je me disais bien qu'il y avait plus simple.
[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.
- Alan Pinard
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 77
- Remerciements reçus 0
il y a 15 ans 9 mois #7098
par Alan Pinard
Alan Pinard
Version A
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,
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- Fonction - Get-MACVendor