Meilleur auteur de réponses
activer compte admin local sur tous les postes

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 ?
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
- Marqué comme réponse Newwo vendredi 5 septembre 2014 12:38
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
- Marqué comme réponse Newwo vendredi 5 septembre 2014 12:38
-
-
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.)
-
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
-
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.)
-
-
"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.
-
"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 # -