Sur Windows Server 2008 R2, j'ai un utilisateur local standard (non administrateur) (pas un compte Active Directory, bien que le serveur soit dans un domaine) qui a accès au serveur uniquement via PowerShell Remoting. L'utilisateur ne peut pas se connecter via RDP.
J'aimerais que cet utilisateur puisse changer de mot de passe. La commande "utilisateur net" nécessite des droits d'administrateur, même si l'utilisateur tente de changer son propre mot de passe.
Comment un utilisateur standard peut-il modifier leur mot de passe de la ligne de commande?
Voici un code PowerShell pour faire ce que vous recherchez avec des comptes de domaine:
param (
[string]$oldPassword = $( Read-Host "Old password"),
[string]$newPassword = $( Read-Host "New password")
)
$ADSystemInfo = New-Object -ComObject ADSystemInfo
$type = $ADSystemInfo.GetType()
$user = [ADSI] "LDAP://$($type.InvokeMember('UserName', 'GetProperty', $null, $ADSystemInfo, $null))"
$user.ChangePassword( $oldPassword, $newPassword)
Le fournisseur ASDI prend également en charge la syntaxe WinNT://computername/username
Pour la méthode ChangePassword()
. L'objet ADSystemInfo
, cependant, ne fonctionnera pas pour les comptes locaux de la machine, il suffit donc de moderniser le code ci-dessus avec WinNT://...
Syntaxe n'est pas fonctionnel.
(Tout le monde veut suggérer une modification avec code pour différencier les comptes locaux et les comptes de domaine?)
Sur une touche complètement différente, l'ancien NetUserChangePassword
API fonctionnera avec local (et domaine, à condition que vous spécifiez le nom de domaine dans NetBIOS Syntaxe).
param (
[string]$oldPassword = $( Read-Host "Old password"),
[string]$newPassword = $( Read-Host "New password")
)
$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern bool NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@
$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru
$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)
Ce code suppose que vous modifiez un mot de passe sur la machine locale (".").
Ceci est en fait assez simple dans PowerShell:
([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')
J'ai essayé les deux réponses ci-dessus en vain, pour changer le mot de passe d'un administrateur local qui n'est pas joint de domaine. Creuser par les commentaires a donné ce dont j'avais besoin.
Pour la deuxième partie de la réponse actuellement acceptée, vous souhaitez mettre à jour la signature pour utiliser long
au lieu de la valeur de retour bool
, et ceux-ci peuvent être dépannés sur les codes d'erreur système. Docs . Donc, vous vous retrouvez avec:
param (
[string]$oldPassword = $( Read-Host "Old password"),
[string]$newPassword = $( Read-Host "New password")
)
$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern **long** NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@
$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru
$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)
Cependant, que n'a pas fonctionné pour moi. Les codes d'erreur alternés entre 86 et 2221, en fonction de la configuration des paramètres. Était sur le point d'abandonner et de crousser plus dans les commentaires et a finalement trouvé le succès en faisant:
([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Absolument ridicule que la modification simple d'un mot de passe administrateur local est tellement compliquée dans PowerShell. Si vous stockez des titres sur votre système sur votre système, la mise à jour du mot de passe doit être effectuée avec la fourniture de l'ancien mot de passe ou de perdre la capacité de perdre la capacité à déchiffrer correctement ces chaînes sécurisées!