Benutzer-Werkzeuge

Webseiten-Werkzeuge


know-how:windows

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
know-how:windows [2023/11/28 15:47] – [VHD into WIM konvertieren] ccknow-how:windows [2024/02/26 10:30] (aktuell) – [reportMalwareDevices.php] cc
Zeile 1: Zeile 1:
 +~~ODT~~
 ====== reportMalwareDevices.php ====== ====== reportMalwareDevices.php ======
   * Analog zu **reportUpdateStates.php** Permissions von deviceManagement read reicht aus   * Analog zu **reportUpdateStates.php** Permissions von deviceManagement read reicht aus
Zeile 694: Zeile 695:
 ... ...
 </code> </code>
 +====== reportMissingNotebooksOwnerBased.php ======
 +  * Analog zu **reportMissingNotebooks.php** nur um die Schüler der 3. und 4. Klasse ergänzt
 +  * **Achtung** - Da die API bei 500 Devices deckelt muss ab 500 eine andere Lösung gefunden werden / Ermittle alle betroffenen User über LDAP im AD und ermittle für jeden einzelnen User die Zugehörigkeit zu einem registrierten Gerät 
 +  * **Update** - es ist doch möglich mehr als 500 Devices zu erhalten mit pagination kann zum nächsten **Link** geblättert werden - danke an Herrn Christoph Pachler 
 +
 +<code>
 +<?php
 +
 +$server = "ldaps://FQDN:636";
 +//domain user to connect to LDAP
 +$user = "USERNAME";
 +//user password
 +$passwd = "PASSWORD";
 +
 +$dn = array(0=>"OU_PATH_ALL_PUPILS");
 +
 +$classesRegex="/^(1|2|3|4).*$/";
 +
 +$search="(objectClass=user)";
 +
 +
 +$errUser=0;
 +$countAll=0;
 +$okUser=0;
 +
 +
 +
 +echo "All Users that haven't enrolled a device: "."\n";
 +
 +for ($j=0; $j<count($dn); $j++)
 +{
 +        $ds=ldap_connect($server);
 +       $r=ldap_bind($ds, $user , $passwd);
 +
 + $sr=ldap_search($ds, $dn[$j], $search, array(0=>"UserPrincipalName",1=>"distinguishedName",2=>"department",3=>"description"));
 +
 + $data = ldap_get_entries($ds, $sr);    
 +       
 +
 +        // $countAll+=$data["count"];
 +
 + for ($i=0; $i<$data["count"]; $i++) 
 + {
 +
 + //echo ($data[$i]["distinguishedname"][0])."\n";
 + //echo ($data[$i]["userprincipalname"][0])."\n";
 + //echo ($data[$i]["department"][0])."\n";
 +
 + $distinguishedName=strtolower($data[$i]["distinguishedname"][0]);
 + $userPrincipalName=strtolower($data[$i]["userprincipalname"][0]);
 + $department=strtolower(@$data[$i]["department"][0]);
 +
 +
 + $regMatch=preg_match($classesRegex,$department);
 +
 + if($regMatch !== 0)
 + {
 +
 +     if(!isset($data[$i]["department"][0]))
 +                    {
 +                        echo "FAIL - User: ".$distinguishedName." has no Department"."\n";
 +                        $errUser++;
 +                    }
 +
 +
 + $countAll++;
 + //Debugging is phun
 + //echo $distinguishedName."\n";
 + //echo $department."\n";
 +
 + $notFound=true;
 +
 + $intuneDevices=getIntuneDevices($userPrincipalName);
 +
 + #Don't hammer microsofts api
 + sleep(rand(3,15));
 +
 + for ($k=0; $k<count($intuneDevices) && $notFound; $k++)
 + {
 +
 +                                 /*
 +     [deviceOwnership] => Personal
 +            [deviceVersion] => 2
 +            [displayName] => LAPTOP
 +            [domainName] => 
 +            [enrollmentProfileName] => 
 +            [enrollmentType] => UserEnrollment
 +            [externalSourceName] => 
 +            [isCompliant] => 1
 +            [isManaged] => 1
 +            [isRooted] => 
 +            [managementType] => MDM
 +            [manufacturer] => LENOVO
 +
 +
 +   */
 +
 + if($intuneDevices[$k]["enrollmentType"]=="UserEnrollment" && $intuneDevices[$k]["manufacturer"]=="LENOVO" &&$intuneDevices[$k]["deviceOwnership"]== "Personal"  )
 + {
 + $notFound=false;
 +
 + }
 +
 +
 +
 +                       
 + }
 +
 +
 + if($notFound)
 + {
 +
 + echo "FAIL - User: ".$distinguishedName." has no enrolled device"."\n";
 + $errUser++;
 +
 + }
 + else
 + {
 + $okUser++;
 + }
 +
 + // Device Details: print_r($intuneDevices[--$k]);
 + }
 +               
 +
 + }
 + // close connection
 + ldap_close($ds);
 +}
 +
 +echo "Summary:\n";
 +echo "All user objects found: ".$countAll."\n";
 +echo "All user objects ok: ".$okUser."\n";
 +echo "Consistency integrity: ";
 +printf("%.2f \n",(($okUser/$countAll)*100));
 +echo "Errors User count: ".$errUser."\n";
 +echo "Regex Classroom check: ".$classesRegex."\n";
 +echo "OU's that i looked for :\n";
 +print_r($dn);
 +
 +echo "\n";
 +
 +
 +
 +
 +function getIntuneDevices($userUPN)
 +{
 +
 +$curl_token= curl_init();
 +//Azure AD Administration: Tenant properties / Tenant ID: 123-123-123-123
 +//
 +// Details: https://docs.microsoft.com/en-us/graph/auth-v2-service
 +curl_setopt($curl_token,CURLOPT_URL, "https://login.microsoftonline.com/123-123-123-123/oauth2/v2.0/token");
 +curl_setopt($curl_token,CURLOPT_HEADER,0);
 +curl_setopt($curl_token,CURLOPT_POST,1);
 +curl_setopt($curl_token,CURLOPT_POSTFIELDS,"client_id=CLIENT_ID_APP&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=SHARED_SECRET&grant_type=client_credentials");
 +curl_setopt($curl_token,CURLOPT_RETURNTRANSFER,1);
 +
 +
 +
 +$json_response=curl_exec($curl_token) or die("Cannot exec url request");
 +
 +curl_close($curl_token);
 +
 +
 +$access_array=json_decode($json_response,true) or die("Cannot decode json");
 +
 +//print_r($access_array);
 +
 +
 +if(!isset($access_array["access_token"]))
 +{
 + die("Cannot receive access_token");
 +}
 +
 +
 +
 +$curl_token= curl_init();
 +
 +
 +curl_setopt($curl_token,CURLOPT_URL, "https://graph.microsoft.com/v1.0/users/".$userUPN."/ownedDevices");
 +curl_setopt($curl_token,CURLOPT_HEADER,0);
 +curl_setopt($curl_token,CURLOPT_POST,0);
 +curl_setopt($curl_token,CURLOPT_HTTPHEADER,array("Authorization: Bearer ".$access_array["access_token"]));
 +curl_setopt($curl_token,CURLOPT_RETURNTRANSFER,1);
 +
 +$json_response=curl_exec($curl_token) or die("Cannot exec url request");
 +
 +curl_close($curl_token);
 +
 +//print_r($json_response);
 +
 +$intune_array=json_decode($json_response,true) or die("Cannot decode json");
 +
 +$intune_array=$intune_array["value"];
 +
 +
 +return $intune_array;
 +
 +
 +
 +}
 +
 +
 +?>
 +
 +</code>
 +
 ====== reportMissingNotebooks.php ====== ====== reportMissingNotebooks.php ======
   * Analog zu **reportRiskUsers.php**   * Analog zu **reportRiskUsers.php**
   * Finde alle Schüler der 1. und 2. Klasse die kein Notebook enrolled haben / zB: als Cron Job    * Finde alle Schüler der 1. und 2. Klasse die kein Notebook enrolled haben / zB: als Cron Job 
   * Im LDAP Attribut **Department** befindet sich die Klassenbzeichnung zB: 2E   * Im LDAP Attribut **Department** befindet sich die Klassenbzeichnung zB: 2E
 +  * **Achtung** Graph API deckelt bei 500 Devices d.h. ab 500 Notebooks muss eine andere Lösung gefunden werden
 +  * **Update** Es ist doch möglich mehr als 500 Devices zu erhalten - es muss in den Results geblättert werden über den nächsten **Link** ->  ** if(isset($intune_array["@odata.nextLink"])) ** , Vielen Dank an Herrn Christoph Pachler
 +              
  
 <code> <code>
Zeile 891: Zeile 1103:
   * Analog zu **reportRiskUsers.php**   * Analog zu **reportRiskUsers.php**
   * Auszug aus dem relevanten Code für https://docs.microsoft.com/en-us/graph/api/intune-devices-manageddevice-list?view=graph-rest-1.0    * Auszug aus dem relevanten Code für https://docs.microsoft.com/en-us/graph/api/intune-devices-manageddevice-list?view=graph-rest-1.0 
 +  * **Update** bei mehr als 500 Geräten muss geblättert werden **nextLink**
   * Es sollen alle im Intune registrierten Geräte gezogen werden   * Es sollen alle im Intune registrierten Geräte gezogen werden
 <code> <code>
Zeile 900: Zeile 1113:
 ... ...
  
 +$devicesLink="https://graph.microsoft.com/v1.0/deviceManagement/managedDevices";
 +      $intune_all=array();
  
 + while(strlen($devicesLink))
 + {
  
-$curl_token= curl_init();+ $curl_token= curl_init();
  
  
-// https://docs.microsoft.com/en-us/graph/api/intune-devices-manageddevice-list?view=graph-rest-1.0 + // https://docs.microsoft.com/en-us/graph/api/intune-devices-manageddevice-list?view=graph-rest-1.0 
-// + // 
-curl_setopt($curl_token,CURLOPT_URL, "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices"); + curl_setopt($curl_token,CURLOPT_URL, $devicesLink); 
-curl_setopt($curl_token,CURLOPT_HEADER,0); + curl_setopt($curl_token,CURLOPT_HEADER,0); 
-curl_setopt($curl_token,CURLOPT_POST,0); + curl_setopt($curl_token,CURLOPT_POST,0); 
-curl_setopt($curl_token,CURLOPT_HTTPHEADER,array("Authorization: Bearer ".$access_array["access_token"])); + curl_setopt($curl_token,CURLOPT_HTTPHEADER,array("Authorization: Bearer ".$access_array["access_token"])); 
-curl_setopt($curl_token,CURLOPT_RETURNTRANSFER,1);+ curl_setopt($curl_token,CURLOPT_RETURNTRANSFER,1);
  
-$json_response=curl_exec($curl_token) or die("Cannot exec url request");+ $json_response=curl_exec($curl_token) or die("Cannot exec url request");
  
-curl_close($curl_token);+ curl_close($curl_token);
  
-//print_r($json_response);+ //print_r($json_response);
  
-$intune_array=json_decode($json_response,true) or die("Cannot decode json");+ $intune_array=json_decode($json_response,true) or die("Cannot decode json")
 +   
 +                if(!isset($intune_array["@odata.nextLink"])) 
 +                { 
 +                        $devicesLink="";
  
-$intune_array=$intune_array["value"];+                } 
 +                else 
 +                { 
 +                        $devicesLink=$intune_array["@odata.nextLink"]; 
 +                }
  
-print_r($intune_array); 
  
 + $intune_array=$intune_array["value"];
 +
 + $intune_all=array_merge($intune_all,$intune_array);
 +
 +
 + }
 +
 +
 +
 +return $intune_all;
 +
 +}
  
 /* /*
Zeile 1171: Zeile 1407:
  
 ====== Powershell Skripte ====== ====== Powershell Skripte ======
 +
 +
 +===== check_last_updates.ps1 =====
 +  * Kerberos Authentifizierung analog zu unterem Beispiel
 +  * Wann wurde zuletzt erfolgreich nach Updates gesucht oder erfolgreich Updates installiert - ist der Threshold größer als 35 Tage d.h. ist es länger als 35 Tage her möchte ich eine Notifikation erhalten
 +<code>
 +#Thanks: https://github.com/Futur-Tech/futur-tech-zabbix-windows-update
 +$threshold=35
 +
 +try
 +{
 +
 +$lastSuccessSearch= ((New-Object -com "Microsoft.Update.AutoUpdate").Results.LastSearchSuccessDate)
 +$lastSuccessInstallation =((New-Object -com "Microsoft.Update.AutoUpdate").Results.LastInstallationSuccessDate)
 +$today =Date
 +
 +$daysPassedSearch=($today - $lastSuccessSearch ).Days
 +$daysPassedInstallation= ($today - $lastSuccessInstallation).Days
 +
 +if( ($daysPassedSearch -gt $threshold) -or ($daysPassedInstallation -gt $threshold) )
 +{
 +
 +$message= "ATTENTION: Last successfull search was $daysPassedSearch ($lastSuccessSearch) days ago , Last successfull installation of updates: $daysPassedInstallation ($lastSuccessInstallation) days"
 +
 +write-host $message
 +
 +#don't hammer the web support service with too much concurrent requests
 +Start-Sleep -seconds (Get-Random -Minimum 1 -Maximum 5 )
 +
 +$postParams = @{room=$env:computername;submit='1';description=$message;action='3'}
 +
 +Invoke-WebRequest -Uri https://support.schule.intern/support.php -Method POST -Body $postParams -UseDefaultCredentials 
 +
 +}
 +
 +}
 +catch
 +{
 +write-host "ERROR - cannot get values related to last updates "
 +}
 +</code> 
 +===== check_Updates_Notification_GPO_Startup.ps1 =====
 +  * Unter https://support.schule.intern wird per Kerberos auf Apache2 Ebene authentifiziert und das support.php Skript übernimmt die weitere Verarbeitung d.h. implicit Authentication - bei Computer GPO als "Rechner$"
 +  * Welche Qualitätsupdates wurden noch nicht installiert und sind ausständig ? Achtung hier gibt es auch eine Variante bei der die optionalen Updates ebenfalls aufscheinen könne (Type 1)
 +
 +<code>
 +# Thank you: https://gist.github.com/Grimthorr/44727ea8cf5d3df11cf7
 +
 +try
 +{
 +
 + $UpdateSession = New-Object -ComObject Microsoft.Update.Session
 + $UpdateSearcher = $UpdateSession.CreateupdateSearcher()
 + $Updates = @($UpdateSearcher.Search("IsHidden=0 and IsInstalled=0").Updates)
 +        $Updates= $Updates | Where-Object Type -eq 1
 +
 + #2024-01-22 cc: Exclude Microcode Update Intel (KB4589208) and Defender Signature Updates
 + $Updates= $Updates | Where-Object Title -NotLike "*Microsoft Defender Antivirus*"
 + $Updates= $Updates | Where-object Title -NotLike "*(KB4589208)"
 +
 +
 + $message = $Updates | Select Title | Out-String -Width 250
 +
 +
 + if ($message.Length )
 + {
 +
 + write-host "Updates available !"
 +
 +                #don't hammer the web support service with too much concurrent requests
 +                Start-Sleep -seconds (Get-Random -Minimum 1 -Maximum 5 )
 +
 +
 + $postParams = @{room=$env:computername;submit='1';description=$message;action='3'}
 +
 + Invoke-WebRequest -Uri https://support.schule.intern/support.php -Method POST -Body $postParams -UseDefaultCredentials 
 +
 +
 + }
 +}
 +catch
 +{
 +write-host "An Error occured"
 +}
 +</code>
 +===== checkAPC-UPS.ps1 =====
 +  * APC Management Card über SNMP (v1) checken und System ggf. herunterfahren + E-Mail Verständigung 
 +  * Offizielle Software von APC - Power Chute bedingt einsetzbar / nicht erkennbar ob Kommunikation zwischen PowerChute und USV funktioniert FIXME
 +  * FIXME Testen der Thresholds und Werte + Timeouts FIXME
 +
 +<code>
 +#Achtung - Force TLS1.2 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12  / Install-Module SNMP
 +# Konfiguration der APC Management-Karte
 +$apcIPAddress = "IP" # Die IP-Adresse der APC Management-Karte
 +$snmpCommunity = "Community" # Die SNMP-Community der APC Management-Karte
 +$snmpVersion = 1 # SNMP-Version (1 oder 2)
 +
 +# Schwellenwerte für die USV
 +$batteryThreshold = 25
 +$remainingTimeThreshold = 5 
 +$timeout= 10
 +# E-Mail-Konfiguration
 +$mailServerIP = "IP_Mailserver" # Die IP-Adresse des E-Mail-Servers (ohne Authentifizierung)
 +$mailFrom = "server@mail." # Die Absender-E-Mail-Adresse
 +$mailTo = "monitoring@mail" # Die Empfänger-E-Mail-Adresse
 +$mailSubject = "USV-Warnung: Herunterfahren von maschine xy" # Der Betreff der E-Mail
 +
 +
 +# USV-Status, verbleibende Leistung und verbleibende Zeit abrufen / On Battery seems to be 3
 +$statusOID = "1.3.6.1.4.1.318.1.1.1.4.1.1.0" # OID für den USV-Status
 +#2023-12-13 cc: Thanks https://www.opsview.com/resources/monitoring/blog/apc-ups-monitoring-useful-oids / runtime remaining divisor 6000 for minutes
 +$batteryCapacityOID = "1.3.6.1.4.1.318.1.1.1.2.2.1.0" # OID für die verbleibende Batterieleistung
 +$remainingTimeOID = "1.3.6.1.4.1.318.1.1.1.2.2.3.0" # OID für die verbleibende Zeit
 +try
 +{
 +
 +#2023-12-13 cc: Important !!! Convert to INT 
 +[int]$status = (Get-SnmpData -IP $apcIPAddress -OID $statusOID -Community $snmpCommunity -Version $snmpVersion -TimeOut $timeout).Data
 +[float]$batteryCapacity = (Get-SnmpData -IP $apcIPAddress -OID $batteryCapacityOID -Community $snmpCommunity -Version $snmpVersion -TimeOut $timeout).Data
 +$remainingTime =  (Get-SnmpData -IP $apcIPAddress -OID $remainingTimeOID -Community $snmpCommunity -Version $snmpVersion -TimeOut $timeout).Data
 +[float]$remainingTime = $remainingTime.Substring(0,$remainingTime.IndexOf(" ")) / 6000 # parse the strange format e.g. 36000 (06:00) -> 6 minutes
 +
 +Write-host "Remaining time: $remainingTime"
 +Write-host "Battery: $batteryCapacity"
 +Write-host "Status: $status"
 +
 +
 +if ( $status -eq 3  -and $batteryCapacity -lt $batteryThreshold -and $remainingTime -lt $remainingTimeThreshold 
 +{
 +    $message = "Die USV läuft auf Batterie, die verbleibende Leistung ist unter $batteryThreshold%, und es verbleiben weniger als $remainingTimeThreshold Minuten. Der Computer wird heruntergefahren."
 +
 +    # E-Mail senden
 +    Send-MailMessage -From $mailFrom -To $mailTo -Subject $mailSubject -Body $message -SmtpServer $mailServerIP
 +
 +    Write-Host "E-Mail wurde gesendet: $message"
 +    
 +    # Herunterfahren des Computers
 +    Write-Host "Der Computer wird heruntergefahren."
 +    Stop-Computer -Force
 +} else {
 +    Write-Host "Die USV befindet sich nicht auf Batterie, die verbleibende Leistung oder Zeit ist ausreichend. Keine Aktion erforderlich."
 +}
 +
 +   exit 0
 +}
 +catch
 +{
 +   Write-Host "Probleme beim Ermitteln der Daten"
 +   exit 1
 +}
 +
 +</code>
  
 ===== Get-licenseKey.ps1 ===== ===== Get-licenseKey.ps1 =====
Zeile 4637: Zeile 5025:
   * https://protection.office.com/antispam    * https://protection.office.com/antispam 
 {{:know-how:2_weiterleitungen_filterrichtlinie_fuer_ausgehenden_spam.png?400|}} {{:know-how:2_weiterleitungen_filterrichtlinie_fuer_ausgehenden_spam.png?400|}}
 +
 +===== Whitelist Absender =====
 +  * **Achtung** Befindet sich aktuell (2024) unter: https://security.microsoft.com/antispam , keine Exchange Regel mehr
 +  * **Antispam-Eingangsrichtlinie** -> dort lassen sich Absendeadressen hinzufügen
 +
 +{{:know-how:0-antispam-whitelist-sender-address.png?400|}}
 +
  
 ===== Spam in Junk-Mail ===== ===== Spam in Junk-Mail =====
know-how/windows.1701182828.txt.gz · Zuletzt geändert: 2023/11/28 15:47 von cc