Utilizzare PowerShell per tracciare la posizione di un dispositivo tramite l’API GeoLocation di Google

Punti chiave

  • Lo script traccia la posizione geografica di un dispositivo utilizzando l’API GeoLocation di Google.
  • È stato progettato per aggiornare i campi personalizzati di NinjaOne con i dati relativi alla posizione.
  • Lo script per tracciare la posizione di un dispositivo richiede una connessione Internet attiva ed è ottimizzato per i dispositivi Windows 10.
  • L’API GeoLocation di Google offre una maggiore precisione e una copertura più ampia rispetto ad altri metodi.
  • L’uso dello script per tracciare la posizione di un dispositivo solleva problemi etici e di privacy.
  • Per evitare violazioni della privacy, è necessario ottenere autorizzazioni esplicite prima di utilizzare questo strumento.
  • La comprensione dei limiti legati alle ricerche effettuabili per intervallo di tempo, e dei costi associati, quando si usa l’API di Google è fondamentale.
  • NinjaOne, in combinazione con script come questo, offre solide funzionalità per le operazioni IT e la gestione delle risorse.

Nell’odierno ecosistema informatico interconnesso, una delle informazioni più preziose è la “posizione”. La capacità di tracciare la posizione geografica dei dispositivi può rivelarsi cruciale in molte operazioni IT, dalla gestione delle risorse al monitoraggio della sicurezza. Questo post del blog analizza uno script PowerShell che consente ai professionisti IT e agli MSP (Managed Service Provider) di tracciare la posizione di un dispositivo Windows e di memorizzarla utilizzando i campi personalizzati di NinjaOne.

Background

Lo script per tracciare la posizione di un dispositivo in questione aggiorna i campi personalizzati con le coordinate geografiche e l’indirizzo di un dispositivo, utilizzando l’API GeoLocation di Google. Per i professionisti IT e gli MSP, conoscere la posizione fisica di un dispositivo è fondamentale. Che si tratti di tracciare apparecchiature rubate, di controllare i dispositivi o di verificare la distribuzione geografica delle risorse IT, le applicazioni di questo script per tracciare la posizione di un dispositivo possono essere varie e profonde.

Lo script per tracciare la posizione di un dispositivo

#Requires -Version 5.1

<#
.SYNOPSIS
    Updates Custom Fields with the location of a device based on the Google GeoLocation API.
.DESCRIPTION
    Updates Custom Fields with the location of a device based on the Google GeoLocation API.

    The CustomFieldName parameter can be used to specify which custom field to save the Latitude and Longitude coordinates to.
    The AddressCustomFieldName parameter can be used to specify which custom field to save the address to.

    This script requires a custom field to save location data in NinjaRMM.
    The default for CustomFieldName is "Location".
    The default for AddressCustomFieldName is "Address".
    You can use any text custom field that you wish.
.EXAMPLE
    -GoogleApiKey "<GeoLocation API key here>"
    Saves the Latitude and Longitude coordinates to the custom field named Location.
.EXAMPLE
    -GoogleApiKey "<GeoLocation API key here>" -CustomFieldName "Location" -AddressCustomFieldName "Address"
    Saves the Latitude and Longitude coordinates to the custom field named Location as well as the address to Address.
.INPUTS
    None
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10
    Release Notes:
    Updated to work with either Parameters or Script Variables
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [String]
    $GoogleApiKey,
    [Parameter()]
    [String]
    $CustomFieldName = "Location",
    [Parameter()]
    [String]
    $AddressCustomFieldName = "Address"
)

begin {
    function Test-StringEmpty {
        param([string]$Text)
        # Returns true if string is empty, null, or whitespace
        process { [string]::IsNullOrEmpty($Text) -or [string]::IsNullOrWhiteSpace($Text) }
    }
    function Get-NearestCity {
        param (
            [double]$lat,
            [double]$lon,
            [string]$GoogleApi
        )
        try {
            $Response = Invoke-RestMethod -Uri "http://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lon&key=$GoogleApi"
        }
        catch {
            throw $Error[0]
        }
        return $Response.results[0].formatted_address
    }
    function Get-WifiNetwork {
        end {
            try {
                netsh.exe wlan sh net mode=bssid | ForEach-Object -Process {
                    if ($_ -match '^SSID (d+) : (.*)$') {
                        $current = @{}
                        $networks += $current
                        $current.Index = $matches[1].trim()
                        $current.SSID = $matches[2].trim()
                    }
                    else {
                        if ($_ -match '^s+(.*)s+:s+(.*)s*$') {
                            $current[$matches[1].trim()] = $matches[2].trim()
                        }
                    }
                } -Begin { $networks = @() } -End { $networks | ForEach-Object { New-Object -TypeName "PSObject" -Property $_ } }    
            }
            catch {
                # return nothing
            }
        }
    }

    # Check if Script Variables are being used
    if (-not $(Test-StringEmpty -Text $env:GoogleApiKey)) {
        $GoogleApiKey = $env:GoogleApiKey
    }
    if (-not $(Test-StringEmpty -Text $env:CustomFieldName)) {
        $CustomFieldName = $env:CustomFieldName
    }
    if (-not $(Test-StringEmpty -Text $env:AddressCustomFieldName)) {
        $AddressCustomFieldName = $env:AddressCustomFieldName
    }
    # Check if api key is set, error if not set
    if ($(Test-StringEmpty -Text $GoogleApiKey)) {
        # Both Parameter and Script Variable are empty
        # Can not combine Parameter "[Parameter(Mandatory)]" and Script Variable Required
        Write-Error "GoogleApiKey is required."
        exit 1
    }

    # Use the system's new line
    $NewLine = $([System.Environment]::NewLine)

    # Build URL with API key
    $Url = "https://www.googleapis.com/geolocation/v1/geolocate?key=$GoogleApiKey"
}
process {
    # Get WIFI network data nearby
    $WiFiData = Get-WifiNetwork |
        Select-Object @{name = 'age'; expression = { 0 } },
        @{name = 'macAddress'; expression = { $_.'BSSID 1' } },
        @{name = 'channel'; expression = { $_.Channel } },
        @{name = 'signalStrength'; expression = { (($_.Signal -replace "%") / 2) - 100 } }

    # Check if we got any number access points
    $Body = if ($WiFiData -and $WiFiData.Count -gt 0) {
        @{
            considerIp       = $true
            wifiAccessPoints = $WiFiData
        } | ConvertTo-Json
    }
    else {
        @{
            considerIp = $true
        } | ConvertTo-Json
    }

    # Get our lat,lng position
    try {
        $Response = Invoke-RestMethod -Method Post -Uri $Url -Body $Body -ContentType "application/json" -ErrorVariable Err
    }
    catch {
        Write-Error $_
        exit 1
    }

    # Save the relevant results to variable that have shorter names
    $Lat = $Response.location.lat
    $Lon = $Response.location.lng

    try {
        # Save Latitude, Longitude to the custom field from the CustomFieldName parameter
        Ninja-Property-Set -Name $CustomFieldName -Value "$Lat,$Lon"
    }
    catch {
        Write-Error "Failed to save to CustomFieldName($CustomFieldName)"
        exit 1
    }

    if ( $(Test-StringEmpty -Text $AddressCustomFieldName) -and $(Test-StringEmpty -Text $env:AddressCustomFieldName)) {
        # Both Parameter and Variable are empty
        Write-Output "$($NewLine)Location: $Lat,$Lon"
    }
    else {
        if ($(Test-StringEmpty -Text $AddressCustomFieldName)) {
            # Parameter was not used
            $AddressCustomFieldName = $env:AddressCustomFieldName
        }

        try {
            # Get City from Google API's
            # Google API: https://developers.google.com/maps/documentation/geocoding/requests-reverse-geocoding
            $Address = Get-NearestCity -lat $Lat -lon $Lon -GoogleApi $GoogleApiKey
        }
        catch {
            Write-Error "Failed to save to get nearest city."
            exit 1
        }

        try {
            # Save Lat and Lon to custom field
            Ninja-Property-Set -Name $AddressCustomFieldName -Value "$Address"
            Write-Output "$($NewLine)Location: $Address`: $Lat,$Lon"
        }
        catch {
            Write-Error "Failed to save to AddressCustomFieldName($AddressCustomFieldName)"
            exit 1
        }
    }
    exit 0
}
end {
    $ScriptVariables = @(
        [PSCustomObject]@{
            name           = "GoogleApiKey"
            calculatedName = "GoogleApiKey"
            required       = $true
            defaultValue   = $null
            valueType      = "TEXT"
            valueList      = $null
            description    = ""
        }
        [PSCustomObject]@{
            name           = "CustomFieldName"
            calculatedName = "CustomFieldName"
            required       = $false
            defaultValue   = [PSCustomObject]@{
                type  = "TEXT"
                value = "Location"
            }
            valueType      = "TEXT"
            valueList      = $null
            description    = ""
        }
    )
}

 

Accedi a oltre 700 script nel Dojo di NinjaOne

Ottieni l’accesso

Analisi dettagliata

Lo script per tracciare la posizione di un dispositivo può essere suddiviso in tre parti principali:

  • Inizializzazione: Lo script per tracciare la posizione di un dispositivo inizia con la definizione di parametri quali GoogleApiKey, CustomFieldName e AddressCustomFieldName. Questi parametri fungono da input per personalizzare il comportamento dello script.
  • Operazioni principali: La parte centrale dello script per tracciare la posizione di un dispositivo prevede:
  • Verifica delle reti WiFi disponibili intorno al dispositivo.
  • Creazione di un payload con i dati WiFi e invio al servizio di geolocalizzazione di Google per ottenere latitudine e longitudine.
  • Recupero della città o dell’indirizzo più vicino utilizzando le coordinate ottenute.
  • Aggiornamento dei campi personalizzati in NinjaOne con i dati relativi alla località.
  • Operazioni conclusive: Le variabili degli script per tracciare la posizione di un dispositivo vengono inizializzate per memorizzare i dati e aiutare nelle operazioni successive.

Casi d’uso potenziali

Consideriamo un professionista IT, Alex, che lavora per un’azienda. È stato incaricato di controllare tutti i computer portatili in diverse filiali. Utilizzando questo script, Alex può recuperare rapidamente la posizione geografica di ciascun portatile, assicurandosi che i dispositivi si trovino effettivamente nelle sedi dichiarate.

Confronti

L’approccio dello script per tracciare la posizione di un dispositivo sfrutta l’API di Google GeoLocation, che offre dettagli precisi sulla posizione. Le alternative potrebbero essere l’utilizzo dei servizi di localizzazione nativi di Windows o di altre API di terze parti. Tuttavia, la quantità dei dati a disposizione e la solida infrastruttura di Google ne fanno una scelta privilegiata per questi campi di applicazione, perché garantiscono una migliore precisione e una copertura più ampia.

Domande frequenti

  • Questo script per tracciare la posizione di un dispositivo funziona anche offline?
    Lo script per tracciare la posizione di un dispositivo richiede una connessione Internet attiva per comunicare con i servizi di Google.
  • C’è un limite al numero di richieste di localizzazione?
    L’API GeoLocation di Google prevede dei limiti in base al tipo di account e alla tipologia di fatturazione scelta.
  • Lo script per tracciare la posizione di un dispositivo funziona solo su Windows 10?
    Il requisito minimo per il sistema operativo dello script è Windows 10.

Implicazioni

Se da un lato la possibilità di tracciare la posizione di un dispositivo rappresenta un ottimo strumento per la gestione delle risorse e la sicurezza, dall’altro pone problemi di privacy. È fondamentale che i team IT si assicurino che questo strumento sia utilizzato in modo etico, con le dovute autorizzazioni e informando le persone coinvolte. Il tracciamento non autorizzato può portare a violazioni delle leggi e delle normative sulla privacy.

Raccomandazioni

  • Fai in modo di avere sempre un’autorizzazione esplicita prima di eseguire questo script per tracciare la posizione di un dispositivo.
  • Assicurati di aver compreso i limiti legati al numero di ricerche per intervallo temporale, e i costi associati, quando usi l’API GeoLocation di Google.
  • Esamina e verifica regolarmente i log per evitare qualsiasi utilizzo scorretto.

Considerazioni finali

Per gli MSP e i professionisti IT, NinjaOne offre una piattaforma preziosa per centralizzare e ottimizzare le operazioni IT. L’integrazione di uno script come quello per tracciare la posizione di un dispositivo amplifica ulteriormente le capacità di NinjaOne, e lo aiuta a essere uno strumento indispensabile per i moderni ambienti IT. Gli script PowerShell, e in particolare quello descritto sopra, offrono un ulteriore livello di flessibilità e potenza agli utenti di NinjaOne, aiutandoli a tenere il passo in un mondo IT dinamico.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

Guarda una demo×
×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.