Résolu Erreur de connexion sur serveur distant

Plus d'informations
il y a 9 mois 3 semaines #34033 par Matthieu
Le script tel quel ou je l'adapte pour supprimer la connexion au serveur ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 mois 3 semaines #34034 par Arnaud Petitjean
Est-ce que tu pourrais nous partager un bout de ton script afin que nous puissions t'aiguiller ?

Ce qui faut faire en général, c'est développer le script pour qu'il fonctionne localement. Une fois que c'est fait, on utilise invoke-command pour le faire exécuter à distance. Mais bon, en fonction du contexte le mode opératoire peut changer un peu.

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 mois 3 semaines - il y a 9 mois 3 semaines #34035 par Matthieu
# Liste des noms des serveurs
$listeServeurs = @("SRVAPP01")

# Création du tableau HTML
$htmlTable = "<html><head><style>table { border-collapse: collapse; width: 50%; } th, td { border: 1px solid black; padding: 8px; text-align: left; }</style></head>`
<body><h2>Informations sur la date du dernier red&eacute;marrage des serveurs Windows</h2><p><font color='orange'>Orange : entre 100 et 299 jours</font></br><font color='red'>Rouge : plus de 300 jours</font></p>`
<table><tr><th>Serveur</th><th>Type d'OS</th><th>Date du dernier red&eacute;marrage</th><th>Nombre de jours depuis le dernier red&eacute;marrage</th></tr>"
# Parcourir chaque serveur dans la liste
foreach ($serveur in $listeServeurs) {
    try {
        # Connexion au serveur distant et récupération de la date du dernier redémarrage
        $session = New-PSSession -ComputerName $serveur -ErrorAction Stop
        $osInfo = Invoke-Command -Session $session -ScriptBlock {
            $os = Get-WmiObject -Class Win32_OperatingSystem
            [PSCustomObject]@{
                'LastBootUpTime' = $os.LastBootUpTime | Get-Date
                'DaysSinceLastReboot' = (Get-Date) - $os.LastBootUpTime
                'OsType' = $os.Caption
            }
        } -ErrorAction Stop

        # Déterminer la couleur en fonction du nombre de jours
        $couleur = if ($osInfo.DaysSinceLastReboot.Days -gt 300) { 'red' } elseif ($osInfo.DaysSinceLastReboot.Days -ge 100) { 'orange' } else { 'black' }

        # Ajouter une ligne au tableau HTML avec la couleur appropriée
        $htmlTable += "<tr><td><font color='$couleur'>$serveur</td><td><font color='$couleur'>$($osInfo.OsType)</font></td><td><font color='$couleur'>$($osInfo.LastBootUpTime.ToString('dd/MM/yyyy'))</font></td><td><font color='$couleur'>$($osInfo.DaysSinceLastReboot.Days)</font></td></tr>"

        # Affichage des informations
        Write-Output "Serveur: $serveur, Date du dernier redémarrage: $($osInfo.LastBootUpTime), Jours depuis le dernier redémarrage: $($osInfo.DaysSinceLastReboot.Days), Type de système d'exploitation: $($osInfo.OsType)"
    }
    catch {
        Write-Error "Erreur lors de la connexion au serveur $serveur : $_"
    }
    finally {
        # Fermer la session PowerShell
        if ($session) {
            Remove-PSSession -Session $session
        }
    }
}



# Fermer le tableau HTML
$htmlTable += "</table></body></html>
Dernière édition: il y a 9 mois 3 semaines par Matthieu.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 mois 3 semaines #34037 par Arnaud Petitjean
Bonjour Matthieu,

Je ne comprends pas d'où proviens ton message d'erreur car ton script a l'air correct.

Cependant, plusieurs remarques :
  1. Préfères l'utilisation des noms FQDN de tes serveurs (dans ta variable $ListeServeurs) plutôt que des noms courts,
  2. Pour le rendre ton script plus efficient, il serait mieux de créer les sessions WinRM vers toutes les machines plutôt que de faire une boucle Foreach. Ainsi la collecte des données s'effectuera en parallèle et l'exécution de ton script n'en sera que plus rapide. Tu peux passer directement ton tableau de noms de machines au paramètre -ComputerName de New-PSSession. 2e effet kiss cool, tu sauras tout de suite quelle machine n'est pas joignable.
  3. Personnellement, je collecterais toutes les données et ensuite je générerais le rapport en HTML. Ainsi, cela évite de mélanger du HTML avec du PowerShell et ça rend la lecture et la compréhension du script plus facile.
  4. Dernier conseil : teste toujours ton script block en local avant de tenter de l'exécuter à distance.

Bonne continuation.
Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 mois 2 semaines #34043 par Matthieu
Bonjour,

Je rebondis sur une de tes remarques. J'ai des serveurs qui ne sont pas dans mon domaine et que je ne peux attaquer qu'avec l'adresse ip. Ce n'est pas possible du coup ? Car tu me dis qu'il faut prendre le fqdn...

Matthieu

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 mois 2 semaines #34044 par Arnaud Petitjean
Bonjour Matthieu,

J'ai des serveurs qui ne sont pas dans mon domaine et que je ne peux attaquer qu'avec l'adresse ip. Ce n'est pas possible du coup ? Car tu me dis qu'il faut prendre le fqdn...

Oui, tu as tout compris ! Comme je te le disais précédemment, l'authentification Kerberos (ou intégrée à l'Active Directory) ne peut pas fonctionner avec l'IP des machines.
De plus, pour que tu puisses attaquer ces machines situées dans un autre domaine, c'est possible mais il faut qu'il y ait une relation d'approbation entre tes domaines (au moins une qui soit unidirectionnelle).

Cela étant dit, si tu veux quand même les attaquer, c'est possible mais cela ne se fera pas à travers Kerberos. Dans ce cas, le protocole mis en jeu sera NTLM, et donc la sécurité sera dégradée. 
Si tu veux persister dans cette voie, je te recommande la lecture attentive de la rubrique d'aide about_Remote_Troubleshooting .

Dans ces scénarios qui peuvent arriver, par exemple dans le cas où ton serveur se trouve dans une DMZ, il est fortement recommandé de mettre en oeuvre un certificat et de basculer le trafic WinRM sur https (port 5986) afin de chiffrer le trafic et se prémunir des attaques de type "man-in-the-middle".

En espérant que ça t'aide... 

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.151 secondes
Propulsé par Kunena