none
activer compte admin local sur tous les postes RRS feed

  • Question

  • Bonjour à tous,

    je cherche un moyen de savoir sur quels postes le compte administrateur local n'est pas activé pour pouvoir l'activer ensuite.

    J'ai vu qu'il était possible avant de l'activer par GPO mais suite à une MAJ Microsoft les champs "mot de passe" et "confirmer le mot de passe" sont grisés pour des raisons de sécurité j'imagine.

    Peut on le faire à l'aide d'un script ?

    mardi 2 septembre 2014 08:36

Réponses

  • Bonjour,

    Tu peux voir l'état du compte admin avec ce genre de script :

            ForEach ($Computer in $ComputerName) {
                try {
                    $localadm=[ADSI]"WinNT://$Computer/$UserName" | Select-Object Properties,LastLogin,BadPasswordAttempts,PasswordAge -ErrorAction STOP
                    if($localadm.properties.UserFlags.value -band 0x2){$AccountDisabled="Yes"} else {$AccountDisabled="No"}
                    if($localadm.properties.UserFlags.value -band 0x0010){$AccountLocked="Yes"} else {$AccountLocked="No"}
                    if($localadm.properties.UserFlags.value -band 0x800000){$PwdExpired="Yes"} else {$PwdExpired="No"}
                    $Object = New-Object PSObject -Property @{
                        'AccountName'        = $UserName
                        'ComputerName'       = $Computer
                        'LastLogin'          = $localadm.LastLogin.value
                        'Last Pwd Change'    = (Get-Date).AddHours(-($localadm.PasswordAge.value/86400))
                        'Bad Password Count' = $localadm.BadPasswordAttempts.value
                        'AccountDisabled'    = $AccountDisabled
                        'AccountLocked'      = $AccountLocked
                        'PwdExpired'         = $PwdExpired 
                    }#End Object
                    Write-Output $Object
                }#End Try
                catch {Write-Warning "Computer $Computer : $_"}
            }#End ForEach
    


    Blog
    Scripts

    • Marqué comme réponse Newwo vendredi 5 septembre 2014 12:38
    mardi 2 septembre 2014 10:51

Toutes les réponses

  • Bonjour,

    Tu peux voir l'état du compte admin avec ce genre de script :

            ForEach ($Computer in $ComputerName) {
                try {
                    $localadm=[ADSI]"WinNT://$Computer/$UserName" | Select-Object Properties,LastLogin,BadPasswordAttempts,PasswordAge -ErrorAction STOP
                    if($localadm.properties.UserFlags.value -band 0x2){$AccountDisabled="Yes"} else {$AccountDisabled="No"}
                    if($localadm.properties.UserFlags.value -band 0x0010){$AccountLocked="Yes"} else {$AccountLocked="No"}
                    if($localadm.properties.UserFlags.value -band 0x800000){$PwdExpired="Yes"} else {$PwdExpired="No"}
                    $Object = New-Object PSObject -Property @{
                        'AccountName'        = $UserName
                        'ComputerName'       = $Computer
                        'LastLogin'          = $localadm.LastLogin.value
                        'Last Pwd Change'    = (Get-Date).AddHours(-($localadm.PasswordAge.value/86400))
                        'Bad Password Count' = $localadm.BadPasswordAttempts.value
                        'AccountDisabled'    = $AccountDisabled
                        'AccountLocked'      = $AccountLocked
                        'PwdExpired'         = $PwdExpired 
                    }#End Object
                    Write-Output $Object
                }#End Try
                catch {Write-Warning "Computer $Computer : $_"}
            }#End ForEach
    


    Blog
    Scripts

    • Marqué comme réponse Newwo vendredi 5 septembre 2014 12:38
    mardi 2 septembre 2014 10:51
  • Je te remercie, je vais tester ça.

    Par contre y'a t'il des champs à modifier ? J'ai un échec lors de l'exécution.

    • Modifié Newwo mardi 2 septembre 2014 12:20
    mardi 2 septembre 2014 11:53
  • Bonjour,

    le compte admin local a des droits très particuliers, surtout vis-à-vis de l'UAC; tu pourrais nous en dire davantage sur ton besoin stp ? Nous pourrons peut etre t'aider autrement.

    Avoir un compte admin avec un même mot de passe sur tous tes postes est une sacrée backdoor qui est d'ailleurs déjà utilisée par des attaquants (cf attaque "Pass the Hash")


    Freddy ELMALEH - Active IT (Active IT)
    Consultant Freelance (Architecte AD, Infrastructure, Audit de sécurité, audit de sites web, tests d'intrusion, etc.)
    MVP Windows Server - Directory Services
    MCITP Enterprise Administrator (2008) - MCSE 2000/2003 Security - MCSA Messaging 2000/2003
    Bibliographie (Administration avancée sous Windows 2008 R2, La sécurité sous Windows 7, etc.)
    FaceBook Twitter LinkedIn

    mardi 2 septembre 2014 13:59
  • Bonjour,

    l'idéal serait d'avoir un tableau qui affiche le nom de l'ordinateur et le statut du compte admin local.

    J'aimerai voir sur quels postes le compte administrateur local est activé ou désactivé. J'ai regardé si toutefois il existait un rapport tout fait sous SCCM 2012 mais je n'ai rien trouvé.

    Sinon j'ai trouvé ce script intéressant sur le centre de script Microsoft, il check l'état des users local pour un pc uniquement. Il faudrait que je puisse faire une boucle pour l'appliquer à l'ensemble des pc si c'est possible.

    Param
    (
    	[Parameter(Position=0,Mandatory=$false)]
    	[ValidateNotNullorEmpty()]
    	[Alias('cn')][String[]]$ComputerName=$Env:COMPUTERNAME,
    	[Parameter(Position=1,Mandatory=$false)]
    	[Alias('un')][String[]]$AccountName,
    	[Parameter(Position=2,Mandatory=$false)]
    	[Alias('cred')][System.Management.Automation.PsCredential]$Credential
    )
    	
    $Obj = @()
    
    Foreach($Computer in $ComputerName)
    {
    	If($Credential)
    	{
    		$AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" `
    		-Filter "LocalAccount='$True'" -ComputerName $Computer -Credential $Credential -ErrorAction Stop
    	}
    	else
    	{
    		$AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" `
    		-Filter "LocalAccount='$True'" -ComputerName $Computer -ErrorAction Stop
    	}
    	
    	Foreach($LocalAccount in $AllLocalAccounts)
    	{
    		$Object = New-Object -TypeName PSObject
    		
    		$Object|Add-Member -MemberType NoteProperty -Name "Name" -Value $LocalAccount.Name
    		$Object|Add-Member -MemberType NoteProperty -Name "Full Name" -Value $LocalAccount.FullName
    		$Object|Add-Member -MemberType NoteProperty -Name "Caption" -Value $LocalAccount.Caption
          	$Object|Add-Member -MemberType NoteProperty -Name "Disabled" -Value $LocalAccount.Disabled
          	$Object|Add-Member -MemberType NoteProperty -Name "Status" -Value $LocalAccount.Status
          	$Object|Add-Member -MemberType NoteProperty -Name "LockOut" -Value $LocalAccount.LockOut
    		$Object|Add-Member -MemberType NoteProperty -Name "Password Changeable" -Value $LocalAccount.PasswordChangeable
    		$Object|Add-Member -MemberType NoteProperty -Name "Password Expires" -Value $LocalAccount.PasswordExpires
    		$Object|Add-Member -MemberType NoteProperty -Name "Password Required" -Value $LocalAccount.PasswordRequired
    		$Object|Add-Member -MemberType NoteProperty -Name "SID" -Value $LocalAccount.SID
    		$Object|Add-Member -MemberType NoteProperty -Name "SID Type" -Value $LocalAccount.SIDType
    		$Object|Add-Member -MemberType NoteProperty -Name "Account Type" -Value $LocalAccount.AccountType
    		$Object|Add-Member -MemberType NoteProperty -Name "Domain" -Value $LocalAccount.Domain
    		$Object|Add-Member -MemberType NoteProperty -Name "Description" -Value $LocalAccount.Description
    		
    		$Obj+=$Object
    	}
    	
    	If($AccountName)
    	{
    		Foreach($Account in $AccountName)
    		{
    			$Obj|Where-Object{$_.Name -like "$Account"}
    		}
    	}
    	else
    	{
    		$Obj
    	}
    }


    • Modifié Newwo mercredi 3 septembre 2014 07:21
    mercredi 3 septembre 2014 07:19
  • Tu peux aussi choisir de lancer ce script localement sur chaque PC et d'écrire le résultat dans un fichier se trouvant sur le réseau; ainsi le script s'exécutera dés que le poste est à nouveau sur le réseau via SCCM (ce qui est plus flexible que d'extraire une liste d'ordinateur et lancer ce script pour lequel tu n'auras de réponses que des postes en ligne au moment de son exécution).

    Freddy ELMALEH - Active IT (Active IT)
    Consultant Freelance (Architecte AD, Infrastructure, Audit de sécurité, audit de sites web, tests d'intrusion, etc.)
    MVP Windows Server - Directory Services
    MCITP Enterprise Administrator (2008) - MCSE 2000/2003 Security - MCSA Messaging 2000/2003
    Bibliographie (Administration avancée sous Windows 2008 R2, La sécurité sous Windows 7, etc.)
    FaceBook Twitter LinkedIn

    mercredi 3 septembre 2014 08:10
  • Je te remercie, je vais tester ça.

    Par contre y'a t'il des champs à modifier ? J'ai un échec lors de l'exécution.

    Il faut juste mettre une liste d'ordinateurs dans $ComputerName :

    $ComputerName = Get-Content Maliste.txt


    Blog
    Scripts

    mercredi 3 septembre 2014 09:25
  • "Tu peux aussi choisir de lancer ce script localement sur chaque PC et d'écrire le résultat dans un fichier se trouvant sur le réseau; ainsi le script s'exécutera dés que le poste est à nouveau sur le réseau via SCCM (ce qui est plus flexible que d'extraire une liste d'ordinateur et lancer ce script pour lequel tu n'auras de réponses que des postes en ligne au moment de son exécution)."

    Oui je vais voir, ça me semble une bonne idée.

     

    Il faut juste mettre une liste d'ordinateurs dans $ComputerName :

    $ComputerName = Get-Content Maliste.txt

    Voici ce que j'ai :

    $ComputerName = Get-Content C:\Users\toto\Desktop\Nouveau dossier\Maliste.txt
     ForEach ($Computer in $ComputerName) {
                try {
                    $localadm=[ADSI]"WinNT://$Computer/$UserName" | Select-Object Properties,LastLogin,BadPasswordAttempts,PasswordAge -ErrorAction STOP
                    if($localadm.properties.UserFlags.value -band 0x2){$AccountDisabled="Yes"} else {$AccountDisabled="No"}
                    if($localadm.properties.UserFlags.value -band 0x0010){$AccountLocked="Yes"} else {$AccountLocked="No"}
                    if($localadm.properties.UserFlags.value -band 0x800000){$PwdExpired="Yes"} else {$PwdExpired="No"}
                    $Object = New-Object PSObject -Property @{
                        'AccountName'        = $UserName
                        'ComputerName'       = $Computer
                        'LastLogin'          = $localadm.LastLogin.value
                        'Last Pwd Change'    = (Get-Date).AddHours(-($localadm.PasswordAge.value/86400))
                        'Bad Password Count' = $localadm.BadPasswordAttempts.value
                        'AccountDisabled'    = $AccountDisabled
                        'AccountLocked'      = $AccountLocked
                        'PwdExpired'         = $PwdExpired 
                    }End Object
                    Write-Output $Object
                }End Try
                catch {Write-Warning "Computer $Computer : $_"}
     }End ForEach

     Il me dit qu'un bloc Catch ou un bloc Finally est manquant dans l'instruction Try.

    jeudi 4 septembre 2014 08:32
  • "Tu peux aussi choisir de lancer ce script localement sur chaque PC et d'écrire le résultat dans un fichier se trouvant sur le réseau; ainsi le script s'exécutera dés que le poste est à nouveau sur le réseau via SCCM (ce qui est plus flexible que d'extraire une liste d'ordinateur et lancer ce script pour lequel tu n'auras de réponses que des postes en ligne au moment de son exécution)."

    Oui je vais voir, ça me semble une bonne idée.

     

    Il faut juste mettre une liste d'ordinateurs dans $ComputerName :

    $ComputerName = Get-Content Maliste.txt

    Voici ce que j'ai :

    $ComputerName = Get-Content C:\Users\toto\Desktop\Nouveau dossier\Maliste.txt
     ForEach ($Computer in $ComputerName) {
                try {
                    $localadm=[ADSI]"WinNT://$Computer/$UserName" | Select-Object Properties,LastLogin,BadPasswordAttempts,PasswordAge -ErrorAction STOP
                    if($localadm.properties.UserFlags.value -band 0x2){$AccountDisabled="Yes"} else {$AccountDisabled="No"}
                    if($localadm.properties.UserFlags.value -band 0x0010){$AccountLocked="Yes"} else {$AccountLocked="No"}
                    if($localadm.properties.UserFlags.value -band 0x800000){$PwdExpired="Yes"} else {$PwdExpired="No"}
                    $Object = New-Object PSObject -Property @{
                        'AccountName'        = $UserName
                        'ComputerName'       = $Computer
                        'LastLogin'          = $localadm.LastLogin.value
                        'Last Pwd Change'    = (Get-Date).AddHours(-($localadm.PasswordAge.value/86400))
                        'Bad Password Count' = $localadm.BadPasswordAttempts.value
                        'AccountDisabled'    = $AccountDisabled
                        'AccountLocked'      = $AccountLocked
                        'PwdExpired'         = $PwdExpired 
                    }End Object
                    Write-Output $Object
                }End Try
                catch {Write-Warning "Computer $Computer : $_"}
     }End ForEach

     Il me dit qu'un bloc Catch ou un bloc Finally est manquant dans l'instruction Try.


    Y'a un loupé dans ton copier coller. il te manque des #

    Blog
    Scripts

    jeudi 4 septembre 2014 14:55
  • Effectivement je n'ai pas fais attention, en revanche j'ai toujours une erreur :

    Avertissement : Computer 630 : L'exception suivante s'est produite lors de la récupération du membre < Properties > : < Erreur inconnue <0x80005000>

    vendredi 5 septembre 2014 07:04