lundi 27 juillet 2020

NPS Logs Parser - Une mise à jour

Une petite publication pour vous faire part d ela mise à jour du script d'interprétation des logs NPS:
La fonction get-NPSLogsFromFile s'est vu ajouter un argument 'LastLines' afin de ne lire que les dernières lignes du fichier de logs et ainsi accélérer le chargement:

Le script est téléchargeable ici

vendredi 29 janvier 2016

Parseur de logs pour NPS (Network Policy Server)

Me revoilà avec quelques améliorations sur mon script pour interpréter les logs de IAS/NPS.
Je vous conseille de configurer votre serveur NPS pour effectuer une rotation quotidienne.

Le script est téléchargeable ici

dimanche 21 septembre 2014

Interpreter les LOGs NPS / IAS

Quelle tâche difficile que d’interpréter rapidement et correctement les LOGs renvoyé par le service Radius Microsoft !
J’ai donc créé 3 fonctions permettant d'interpréter les logs NPS (Network Policy Server) ou IAS (Internet Authentication Service) :

GetIASLog qui permet de récupérer les LOG NPS via une boite de dialogue ou via la parametre « File »
InterpretIAS qui est utilisée dans la fonction précédente et qui change les code interne en quelque chose de plus compréhensible (ex : Packet-Type = 2 => Access-Accept)
GetLastLog qui accepte en paramètres les logs et le nombre de ligne à renvoyer.

Ainsi, pour récupérer les logs de « D:\Users\gmergoux\Desktop\IN1409.log » dans la variable $MyLogs il suffira d’exécuter la commande suivante :
$MyLogs=GetIASLog -File D:\Users\gmergoux\Desktop\IN1409.log

Les logs sont ensuites interpretables via les commandes Powerhsell habituels, comme par exemple $MyLogs | ft

Pour récupérer seulement les 20 derniers logs avec les informations les plus essentielles :

GetLastLog -IASLogs $MyLogs -LastSelect 20


Function InterpretIAS{
param($IASDAtas)
$FormatIAS = @{Expression={$_.ComputerName};Label="ComputerName"}, `
@{Expression={$_.ServiceName};Label="ServiceName"}, `
@{Expression={$_."Record-Date"};Label="Record-Date"}, `
@{Expression={$_."Record-Time"};Label="Record-Time"}, `
@{Expression={
switch ($_."Packet-Type") 

1 {"Access-Request (1)"} 
2 {"Access-Accept (2)"} 
3 {"Access-Reject (3)"} 
4 {"Accounting-Request (4)"} 
5 {"Accounting-Response (5)"} 
11 {"Access-Challenge (11)"} 
12 {"Status-Server (experimental) (12)"} 
13 {"Status-Client (experimental) (13)"} 
"" { "" }
default {($_)+" (unrecognized type)"} 
}
};Label="Packet-Type"}, `
@{Expression={$_."User-Name"};Label="User-Name"}, `
@{Expression={$_."Fully-Qualified-Distinguished-Name"};Label="Fully-Qualified-Distinguished-Name"}, `
@{Expression={$_."Called-Station-ID"};Label="Called-Station-ID"}, `
@{Expression={$_."Calling-Station-ID"};Label="Calling-Station-ID"}, `
@{Expression={$_."Callback-Number"};Label="Callback-Number"}, `
@{Expression={$_."Framed-IP-Address"};Label="Framed-IP-Address"}, `
@{Expression={$_."NAS-Identifier"};Label="NAS-Identifier"}, `
@{Expression={$_."NAS-IP-Address"};Label="NAS-IP-Address"}, `
@{Expression={$_."NAS-Port"};Label="NAS-Port"}, `
@{Expression={$_."Client-Vendor"};Label="Client-Vendor"}, `
@{Expression={$_."Client-IP-Address"};Label="Client-IP-Address"}, `
@{Expression={$_."Client-Friendly-Name"};Label="Client-Friendly-Name"}, `
@{Expression={$_."Event-Timestamp"};Label="Event-Timestamp"}, `
@{Expression={$_."Port-Limit"};Label="Port-Limit"}, `
@{Expression={$_."NAS-Port-Type"};Label="NAS-Port-Type"}, `
@{Expression={$_."Connect-Info"};Label="Connect-Info"}, `
@{Expression={$_."Framed-Protocol"};Label="Framed-Protocol"}, `
@{Expression={$_."Service-Type"};Label="Service-Type"}, `
@{Expression={
switch ($_."Authentication-Type") 

1 {"PAP (1)"} 
2 {"CHAP (2)"} 
3 {"MS-CHAP (3)"} 
4 {"MS-CHAP v2 (4)"} 
5 {"EAP (5)"} 
7 {"None (7)"} 
8 {"Custom (8)" }
11 {"PEAP (11)" }
"" { "" }
default {($_)+" (unrecognized type)"} 
}
};Label="Authentication-Type"}, `
@{Expression={$_."Policy-Name"};Label="Policy-Name"}, `
@{Expression={
switch ($_."Reason-Code") 

0 {"IAS_SUCCESS (0)"}
1 {"IAS_INTERNAL_ERROR (1)"} 
2 {"IAS_ACCESS_DENIED (2)"} 
3 {"IAS_MALFORMED_REQUEST (3)"} 
4 {"IAS_GLOBAL_CATALOG_UNAVAILABLE (4)"} 
5 {"IAS_DOMAIN_UNAVAILABLE (5)"} 
6 {"IAS_SERVER_UNAVAILABLE (6)"} 
7 {"IAS_NO_SUCH_DOMAIN (7)"} 
8 {"IAS_NO_SUCH_USER (8)"} 
16 {"IAS_AUTH_FAILURE (16)"} 
17 {"IAS_CHANGE_PASSWORD_FAILURE (17)"} 
18 {"IAS_UNSUPPORTED_AUTH_TYPE (18)"} 
32 {"IAS_LOCAL_USERS_ONLY (32)"} 
33 {"IAS_PASSWORD_MUST_CHANGE (33)"} 
34 {"IAS_ACCOUNT_DISABLED (34)"} 
35 {"IAS_ACCOUNT_EXPIRED (35)"} 
36 {"IAS_ACCOUNT_LOCKED_OUT (36)"} 
37 {"IAS_INVALID_LOGON_HOURS (37)"} 
38 {"IAS_ACCOUNT_RESTRICTION (38)"} 
48 {"IAS_NO_POLICY_MATCH (48)"} 
64 {"IAS_DIALIN_LOCKED_OUT (64)"} 
65 {"IAS_DIALIN_DISABLED (65)"} 
66 {"IAS_INVALID_AUTH_TYPE (66)"} 
67 {"IAS_INVALID_CALLING_STATION (67)"} 
68 {"IAS_INVALID_DIALIN_HOURS (68)"} 
69 {"IAS_INVALID_CALLED_STATION (69)"} 
70 {"IAS_INVALID_PORT_TYPE (70)"} 
71 {"IAS_INVALID_RESTRICTION (71)"} 
80 {"IAS_NO_RECORD (80)"} 
96 {"IAS_SESSION_TIMEOUT (96)"} 
97 {"IAS_UNEXPECTED_REQUEST (97)"} 
"" { "" }
default {($_)+" (unrecognized reason)"} 
}
};Label="Reason-Code"}, `
@{Expression={$_."Class"};Label="Class"}, `
@{Expression={$_."Session-Timeout"};Label="Session-Timeout"}, `
@{Expression={$_."Idle-Timeout"};Label="Idle-Timeout"}, `
@{Expression={$_."Termination-Action"};Label="Termination-Action"}, `
@{Expression={$_."EAP-Friendly-Name"};Label="EAP-Friendly-Name"}, `
@{Expression={$_."Acct-Status-Type"};Label="Acct-Status-Type"}, `
@{Expression={$_."Acct-Delay-Time"};Label="Acct-Delay-Time"}, `
@{Expression={$_."Acct-Input-Octets"};Label="Acct-Input-Octets"}, `
@{Expression={$_."Acct-Output-Octets"};Label="Acct-Output-Octets"}, `
@{Expression={$_."Acct-Session-Id"};Label="Acct-Session-Id"}, `
@{Expression={$_."Acct-Authentic"};Label="Acct-Authentic"}, `
@{Expression={$_."Acct-Session-Time"};Label="Acct-Session-Time"}, `
@{Expression={$_."Acct-Input-Packets"};Label="Acct-Input-Packets"}, `
@{Expression={$_."Acct-Output-Packets"};Label="Acct-Output-Packets"}, `
@{Expression={$_."Acct-Terminate-Cause"};Label="Acct-Terminate-Cause"}, `
@{Expression={$_."Acct-Multi-Ssn-ID"};Label="Acct-Multi-Ssn-ID"}, `
@{Expression={$_."Acct-Link-Count"};Label="Acct-Link-Count"}, `
@{Expression={$_."Acct-Interim-Interval"};Label="Acct-Interim-Interval"}, `
@{Expression={$_."Tunnel-Type"};Label="Tunnel-Type"}, `
@{Expression={$_."Tunnel-Medium-Type"};Label="Tunnel-Medium-Type"}, `
@{Expression={$_."Tunnel-Client-Endpt"};Label="Tunnel-Client-Endpt"}, `
@{Expression={$_."Tunnel-Server-Endpt"};Label="Tunnel-Server-Endpt"}, `
@{Expression={$_."Acct-Tunnel-Conn"};Label="Acct-Tunnel-Conn"}, `
@{Expression={$_."Tunnel-Pvt-Group-ID"};Label="Tunnel-Pvt-Group-ID"}, `
@{Expression={$_."Tunnel-Assignment-ID"};Label="Tunnel-Assignment-ID"}, `
@{Expression={$_."Tunnel-Preference"};Label="Tunnel-Preference"}, `
@{Expression={$_."MS-Acct-Auth-Type"};Label="MS-Acct-Auth-Type"}, `
@{Expression={$_."MS-Acct-EAP-Type"};Label="MS-Acct-EAP-Type"}, `
@{Expression={$_."MS-RAS-Version"};Label="MS-RAS-Version"}, `
@{Expression={$_."MS-RAS-Vendor"};Label="MS-RAS-Vendor"}, `
@{Expression={$_."MS-CHAP-Error"};Label="MS-CHAP-Error"}, `
@{Expression={$_."MS-CHAP-Domain"};Label="MS-CHAP-Domain"}, `
@{Expression={$_."MS-MPPE-Encryption-Types"};Label="MS-MPPE-Encryption-Types"}, `
@{Expression={$_."MS-MPPE-Encryption-Policy"};Label="MS-MPPE-Encryption-Policy"}, `
@{Expression={$_."Proxy-Policy-Name"};Label="Proxy-Policy-Name"}, `
@{Expression={$_."Provider-Type"};Label="Provider-Type"}, `
@{Expression={$_."Provider-Name"};Label="Provider-Name"}, `
@{Expression={$_."Remote-Server-Address"};Label="Remote-Server-Address"}, `
@{Expression={$_."MS-RAS-Client-Name"};Label="MS-RAS-Client-Name"}, `
@{Expression={$_."MS-RAS-Client-Version"};Label="MS-RAS-Client-Version"}
return($IASDAtas | Select-Object $FormatIAS)
}

Function GetIASLog{
param($File="")
If($File -eq ""){
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = ((Get-Item ENV:SystemRoot).Value+"\System32\LogFiles")
$OpenFileDialog.filter = "All files (*.*)| *.*"
$OpenFileDialog.ShowDialog() | Out-Null
$File=$OpenFileDialog.filename
}
$IASLogs=Import-Csv -Delimiter "," -Path $File -Header ComputerName,ServiceName,Record-Date,Record-Time,Packet-Type,User-Name,Fully-Qualified-Distinguished-Name,Called-Station-ID,Calling-Station-ID,Callback-Number,Framed-IP-Address,NAS-Identifier,NAS-IP-Address,NAS-Port,Client-Vendor,Client-IP-Address,Client-Friendly-Name,Event-Timestamp,Port-Limit,NAS-Port-Type,Connect-Info,Framed-Protocol,Service-Type,Authentication-Type,Policy-Name,Reason-Code,Class,Session-Timeout,Idle-Timeout,Termination-Action,EAP-Friendly-Name,Acct-Status-Type,Acct-Delay-Time,Acct-Input-Octets,Acct-Output-Octets,Acct-Session-Id,Acct-Authentic,Acct-Session-Time,Acct-Input-Packets,Acct-Output-Packets,Acct-Terminate-Cause,Acct-Multi-Ssn-ID,Acct-Link-Count,Acct-Interim-Interval,Tunnel-Type,Tunnel-Medium-Type,Tunnel-Client-Endpt,Tunnel-Server-Endpt,Acct-Tunnel-Conn,Tunnel-Pvt-Group-ID,Tunnel-Assignment-ID,Tunnel-Preference,MS-Acct-Auth-Type,MS-Acct-EAP-Type,MS-RAS-Version,MS-RAS-Vendor,MS-CHAP-Error,MS-CHAP-Domain,MS-MPPE-Encryption-Types,MS-MPPE-Encryption-Policy,Proxy-Policy-Name,Provider-Type,Provider-Name,Remote-Server-Address,MS-RAS-Client-Name,MS-RAS-Client-Version
return (InterpretIAS -IASDAtas $IASLogs)
}

function Format-Color([hashtable] $Colors = @{}, [switch] $SimpleMatch) {
$lines = ($input | Out-String) -replace "`r", "" -split "`n"
foreach($line in $lines) {
$color = ''
foreach($pattern in $Colors.Keys){
if(!$SimpleMatch -and $line -match $pattern) { $color = $Colors[$pattern] }
elseif ($SimpleMatch -and $line -like $pattern) { $color = $Colors[$pattern] }
}
if($color) {
Write-Host -ForegroundColor $color $line
} else {
Write-Host $line
}
}
}

Function GetLastLog{
param($IASLogs,$LastSelect=10)
$IASLogs | select -Last $LastSelect | ft "Record-Time","Packet-Type","User-Name","Authentication-Type","Policy-Name","Reason-Code","Proxy-Policy-Name" -AutoSize | GetColoredLogs
}

Function GetColoredLogs{
$input | Format-Color @{'Access-Reject' = 'Red'; 'Access-Accept ' = 'Green'}
}

mercredi 21 août 2013

Installer VMware Tools sous pfsense / FreeBSD

Suite à une installation de pfsense dans un environnement VMware, j'ai un peu galérer pour installer les VMware tools.

Bien sûr, il est possible d'installer Open VM Tools, mais VMware les détectes comme non officiels...

Je suis donc tombé sur http://www.howtoforge.com/how-to-install-vmware-tools-on-pfsense-freebsd qui explique comment installer les tools. J'ai ajouté 2 ou 3 petites infos supplémentaires pour correspondre aux dernières version.

Alors, comment faire? Rien de plus simple, mais il faut bien respecter les étapes!

mercredi 23 mai 2012

Exchange 2010 et la maintenance


Récemment, un de mes clients s'est interrogé sur le fait que lors du passage de la défragmentation en ligne sur sa base Exchange, aucun évènement n’était présent dans les journaux indiquant un gain d'espace.

Selon Microsoft, beaucoup de chose ont changées dans Exchange 2010 (cf. http://technet.microsoft.com/en-us/library/bb125040.aspx)

Je vous propose donc un petit résumé de ce qui se passe dans vos bases Exchange 2010 au travers de ce post.
Bonne lecture :)

samedi 14 avril 2012

Powershell - Interagir avec l'utilisateur

Si vous souhaitez interagir avec l'utilisateur dans vos scripts powershell, voici un exemple:

Activer PSRemoting


Après pas mal de galères pour activer PSRemoting voici les étapes nécessaire pour le bon fonctionnement:
Mon but était qu'une machine non intégrée au domaine puisse exécuter des commande powershell a distance

Pour ce faire, il est nécessaire côté serveur de:

  • Mettre en place un clef dans la base de registre (si seules les machines de votre domaine vont accéder  à votre serveur, inutile - RQ: dans certains cas des erreurs d'accès refuser peuvent apparaître si vous ne mettez pas cette clef, ceci est du à l'UAC, et il faut alors utiliser le compte Administrator et non votre compte habituel d'administration (même si vous élever votre prompt))
  • Créer un certificat pour le support SSL
  • Activer PSRemoting
  • Activer le support SSL
  • Ouvrir le firewall
  • Autoriser CREDSSP
Côté client, il sera nécessaire:
  • Mettre en place un clef dans la base de registre (si seules les machines de votre domaine vont accéder  à votre serveur, inutile)
  • Activer la délégation serveur


vendredi 30 mars 2012

Tester l'alignement des partitions

Pour des questions de performances, il est impératif que vos partitions soient aligner correctement (http://support.microsoft.com/kb/929491/en).
Mais comment tester cet alignement?

Le script Powershell suivant vous donnera l'information:


$wmiDiskPartition = get-wmiobject -class "Win32_DiskPartition" -namespace "root\CIMV2"
$wmiLogicalDisk = get-wmiobject -class "Win32_LogicalDiskToPartition" -namespace "root\CIMV2"
$MaListe=@()    
foreach ($partition in $wmiDiskPartition){
$MyResult=(($partition.StartingOffset) / 4096)
$d=New-Object PSObject
$d | Add-Member -Name Name -MemberType NoteProperty -Value ($partition.Name)
$Trouve=$False
foreach($part in $wmiLogicalDisk){
if( ((($part.antecedent).split("=")[1]).replace("""","")) -eq (($partition.Name).Replace("Disque n° ","Disk #").Replace("partition n° ","Partition #"))){
$Trouve=$True
$d | Add-Member -Name DriveLetter -MemberType NoteProperty -Value (($part.Dependent.split("=")[1]).replace("""",""))
}
}
if ($Trouve -eq $False){
$d | Add-Member -Name DriveLetter -MemberType NoteProperty -Value "N/A"
}
$d | Add-Member -Name BlockSize -MemberType NoteProperty -Value ($partition.BlockSize)
$d | Add-Member -Name NumberOfBlock -MemberType NoteProperty -Value ($partition.NumberOfBlocks)
$d | Add-Member -Name StartingOffset -MemberType NoteProperty -Value ($partition.StartingOffset)
$d | Add-Member -Name IsAligned -MemberType NoteProperty -Value ([int]$MyResult -eq $MyResult)
$MaListe+=$d
}
$MaListe | ft

mardi 6 mars 2012

Antispam d'exchange 2010

L’activation de l’AntiSPAM d’exchange 2010 se fait de manière très simple, mais avant, essayons de comprendre un peu comment il travaille :
9 types de filtrages existent :
  1. 1.       Liste verte IP (IP Alow List)
  2. 2.       Liste rouge IP (Ip Black List)
  3. 3.       Fournisseur de liste verte IP (IP Allow List Provider)
  4. 4.       Fournisseur de liste rouge IP (IP Block List Provider)
  5. 5.       Filtrage d’expéditeur (Sender Filter)
  6. 6.       Filtrage de destinataires (Recipient Filter)
  7. 7.       ID de l’éxpéditeur (Sender ID Filter)
  8. 8.       Filtrage de contenu (Content Filtering)
  9. 9.       Réputation de l’expéditeur (Sender Reputation Filter –SRF)

Ces différents filtrages s’exécutent dans l’ordre énoncé ci-dessus

Mise en cache des dossiers courriers des autres utilisateurs dans outlook 2007

Peut-être avez-vous remarqué que si vous ajouter des comptes supplémentaires dans votre outlook le cache ne fonctionne pas. Microsoft propose une KB (MSKB955572) qui vous explique comment contourner ce problème

Accéder aux commandes du clique-droit en powershell

Avez-vous déjà voulu accéder en PowerShell aux commandes du clique-droit?

Rien de plus simple, il suffit d'utiliser Shell.Application!


$drive = 'h:'
$sa = New-Object -comObject Shell.Application
$sa.Namespace(17).parseName($drive)

La commande suivant renvoie la liste des fonctions disponibles:
$sa.Namespace(17).ParseName("$drive").Verbs()

Par exemple:
$sa.Namespace(17).ParseName("$drive").InvokeVerb("Eject")
$sa.Namespace(17).ParseName("$drive").InvokeVerb("Format")

Forcer l’éjection d'un périphérique amovible

N'avez vous jamais été confronté à un périphérique USB qui ne veut pas s’éjecter?

Et bien voici la solution: devioctl

Ce programme en ligne de commande va forcer le démontage d'un volume, puis effectuer l’éjection.

Le programme est disponible ici: http://www.ltr-data.se/opencode.html

Et voici comment éjecter le lecteur E:


devioctl.exe forcedismount e:
devioctl.exe eject e:

Restauration de messages sous Exchange 2007

Dans cet exemple, nous allons restaurer des mails depuis une base de données Exchange 2007:

La machine sur laquelle les lignes de commandes ont été récupérées se nomme SBS-2008 et se compose d'Active Directory & Exchange 2007 SP3

mardi 24 janvier 2012

Connaitre l'espace occupé par les mails

Si vous souhaitez savoir l'espace occupé dans les bases de données et sur les disques par vos différentes banques Exchange, vous pouvez utiliser le script suivant:

mardi 29 novembre 2011

Connaitre les quotas des boites mails

Si vous chercher a connaitre les quotas appliqués à vos utilisateurs sur exchange 2010, le script suivant pourra vous aidé.

dimanche 6 novembre 2011

Créer des variables en PowerShell sous forme de tableau

Récemment, j'ai eu besoin de créer des variables en PowerShell sur lesquelles je souhaitais faire des tris et avoir une présentation du même type que get-childitem ou autre.

En fait, ce que je souhaitais avoir, c’était quelque chose de ce genre:

Ceci s'apparente à une "Hash table", mais pour réaliser ceci des façon simple, les informations disponible sur le net sont difficile à trouver.

samedi 5 novembre 2011

De la couleur dans PowerShell!

Si vous aussi vous souhaitez mettre de la couleur dans vos scripts, vous pouvez utiliser les options -ForegroundColor et -BackgroundColor de la fonction Write-Host.

Mais quels sont les couleurs disponibles?

Supprimer les boites déconnectées dans exchange

Peut-être avez vous déjà essayé de supprimer une boite mail dans exchange.
Elle apparaît alors dans les boites aux lettres déconnectées.

Pour supprimer définitivement les boîtes, vous pouvez utiliser ce script PowerShell:


foreach ($database in (Get-MailboxDatabase)){
$myBal=Get-MailboxStatistics -Database $database.Name | Where {$_.DisconnectDate -ne $null}
if($myBal.Database -ne $null){
Remove-StoreMailbox -Database ($myBal.Database) -Identity ($myBal.DisplayName) -MailboxState ($myBal.DisconnectReason)
}
}

jeudi 28 avril 2011

Installer Open Manage sur ESXi

Et voici une fonction Power Shell bien pratique pour installer Open Manage sur un ESXi.
J'ai récupéré la fonction de base sur différents site, puis je l'ai un petit peu modifié :)

Après avoir copié cette fonction dans votre invite, il suffit de lancer la commande suivante pour déployer Open Manage:
installDellOpenManage 'E:\Sources' 'OM-SrvAdmin-Dell-Web-6.5.0-2247.VIB-ESX41i_A01' 'MyCom' 'frves-centreon01' 'frbrs-vc01' 'frbrh-esx73' 'root' 'MyPasswOrd!'

vendredi 22 avril 2011

Multipathing vSphere

Si vous souhaitez mettre en place un réseau de stockage sur une infrastructure vSphere, vous voudrez probablement mettre en place des MTU a 9000.

Or pour réaliser une telle opération, vous devez passer par la ligne de commande VMware.

Voici une fonction PowerCLI qui vous permettra de créer vos Virtual Machine Port Group & VMKernel pour  un réseau de stockage (type iSCSI ou NFS).

Coller simplement cette fonction dans votre shell PowerCLI, puis exécutez là, par exemple via:
configureMultipathing 'MonVCenter.dom.local' 'ESX1.dom.local' 'vSwitch-STO' 'STOCKAGE' 'NFS01' 'NFS02' 'vmnic0' 'vmnic4' '192.168.20.2' '192.168.20.12' '255.255.255.0'