Powershell Web Service

This script demonstrates how to query a web service to retrieve a computer name using a MAC address.

Normally, you would check a database or a CSV file for this information. However, for the purpose of this example, we will use a switch statement.

# Requires administrative privileges to execute
Add-Type -AssemblyName System.Net.Http
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://+:8000/")
$listener.Start()
Write-Host "Listening on http://localhost:8000/"

$logPath = "c:\windows\temp\webservice2.log"
Write-Host "Log file on $logPath"
try {
    while ($listener.IsListening) {
        $context = $listener.GetContext()
        $request = $context.Request
        $response = $context.Response
        # Retrieve the 'macaddress' parameter from the URL
        $macaddress = $request.QueryString["macaddress"]
        # Log the macaddress to the log file
        Add-Content -Path $logPath -Value "MAC Address : $macaddress"
        $Computername = ""
        $POSTYPE = ""
        # Response based on the parameter
        switch ($macaddress) {
            "20-C1-9B-08-27-21" { 
                $Computername = "PCdavid"
                $POSTYPE = "TypeA"  # Example value for POSTYPE
            }
            "00-BE-43-23-10-2C" { 
                $Computername = "PCromain"
                $POSTYPE = "TypeB"  # Example value for POSTYPE
            }
            default { 
                $Computername = $null
                $POSTYPE = "Unknown"  # POSTYPE value for unknown or not provided cases
            }
        }
        # Handle the case where 'macaddress' is not provided or unknown
        if (-not $Computername) {
            $response.StatusCode = 404  # HTTP code for "Not Found" or "Not Provided"
            Add-Content -Path $logPath -Value "ERROR 404"
            Add-Content -Path $logPath -Value ""
            Write-Host "$macaddress = No Found"
            $jsonResponse = @{ 
                Error = "No computer found with the provided MAC address."
                POSTYPE = $POSTYPE
            } | ConvertTo-Json
        } else {
            # To return JSON
            Add-Content -Path $logPath -Value "$Computername"
            Add-Content -Path $logPath -Value ""
            Write-Host "$macaddress = $Computername"
            $response.Headers.Add("Content-Type", "application/json")
            $jsonResponse = @{ 
                Computername = $Computername
                POSTYPE = $POSTYPE
            } | ConvertTo-Json
        }
        # Write the response
        $buffer = [System.Text.Encoding]::UTF8.GetBytes($jsonResponse)
        $response.ContentLength64 = $buffer.Length
        $response.OutputStream.Write($buffer, 0, $buffer.Length)
        $response.OutputStream.Close()
    }
} finally {
    $listener. Stop()
}


Other option use PHP for Web service

I am hosting this PHP script on my Synology NAS

<?php
// Récupérer le paramètre 'macaddress' de l'URL
$macaddress = $_GET['macaddress'] ?? ''; // Utilisation de l'opérateur Null Coalesce pour PHP 7+

// Logique pour définir Computername et POSTYPE
switch ($macaddress) {
    case "20-C1-9B-08-27-21":
        $computername = "PCdavid";
        $postype = "TypeA";
        break;
    case "00-BE-43-23-10-2C":
        $computername = "PCromain";
        $postype = "TypeB";
        break;
    default:
        $computername = null;
        $postype = "Unknown";
}

if ($computername === null) {
    http_response_code(404);
    $response = json_encode([
        "Error" => "No computer found with the provided MAC address.",
        "POSTYPE" => $postype
    ]);
} else {
    $response = json_encode([
        "Computername" => $computername,
        "POSTYPE" => $postype
    ]);
}

// Renvoyer la réponse
header('Content-Type: application/json');
echo $response;
?>

Prompt web service

This script retrieves the MAC address and uses a web service to obtain the computer name.


# Obtain all network interfaces with their MAC addresses
$macAddresses = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -ExpandProperty MacAddress
# Webservice URL
$webserviceUrl = "http://localhost:8000/"
# Flag to indicate a successful response
$found = $false
# Loop through each MAC address and call the webservice
foreach ($mac in $macAddresses) {
    if ($found) {
        break  # Exit the loop if a successful match was already found
    }
    # Construct the URL with the MAC address as a parameter
    $url = $webserviceUrl + "?macaddress=$mac"
    
    # Call the webservice
    try {
        $response = Invoke-RestMethod -Uri $url
        # Check if the response contains the Computername
        if ($response.Computername) {
            Write-Host "Response from server for MAC ${mac}: Computername = $($response.Computername), POSTYPE = $($response.POSTYPE)"
            $found = $true  # Set the flag as true to indicate a match was found
        } else {
            Write-Host "No valid computer found for MAC ${mac}: $($response.Error)"
        }
    } catch {
        Write-Host "Error contacting webservice for MAC ${mac}: $_"
    }
}
if (-not $found) {
    Write-Host "No valid entries were found for any MAC addresses."
}

Script to change unattend.xml

# Obtain all network interfaces with their MAC addresses
$macAddresses = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -ExpandProperty MacAddress

# Webservice URL for your NAS
$webserviceUrl = "http://nas.wuibaille.fr/webservice/get-computer-info.php"

# Path to the unattend.xml file
$xmlFilePath = "C:\Windows\Panther\unattend.xml"

# Ensure the XML file exists before proceeding
if (Test-Path $xmlFilePath) {
    # Load the XML file
    [xml]$xmlDoc = Get-Content $xmlFilePath

    # Define the namespace manager
    $ns = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
    $ns.AddNamespace("ns", "urn:schemas-microsoft-com:unattend")

    # Loop through each MAC address and call the webservice
    foreach ($mac in $macAddresses) {
        # Construct the URL with the MAC address as a parameter
        $url = $webserviceUrl + "?macaddress=$mac"

        # Call the webservice
        try {
            $response = Invoke-RestMethod -Uri $url
            # Check if the response contains the ComputerName
            if ($response.Computername) {
                Write-Host "Response from server for MAC ${mac}: Computername = $($response.Computername)"

                # Attempt to find and modify the ComputerName element
                $computerNameNode = $xmlDoc.SelectSingleNode("//ns:settings[@pass='specialize']/ns:component/ns:ComputerName", $ns)
                if ($computerNameNode -ne $null) {
                    $computerNameNode.InnerText = $response.Computername
                    # Save the modified XML file
                    $xmlDoc.Save($xmlFilePath)
                    Write-Host "The ComputerName in unattend.xml has been updated to $($response.Computername)"
                    break  # Exit the loop as we've successfully updated the file
                } else {
                    Write-Host "No ComputerName element found in XML."
                }
            } else {
                Write-Host "No valid computer found for MAC ${mac}"
            }
        } catch {
            Write-Host "Error contacting webservice for MAC ${mac}: $_"
        }
    }
} else {
    Write-Host "The unattend.xml file does not exist at the specified path."
}


0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.