Standart bir Windows kullanıcısı, komut satırından şifrelerini nasıl değiştirebilir?


18

Windows Server 2008 R2'de, sunucuya yalnızca PowerShell Remoting aracılığıyla erişimi olan standart (yönetici olmayan) bir yerel kullanıcı (sunucu bir etki alanında olmasına rağmen Active Directory hesabı değil) var. Kullanıcı RDP ile giriş yapamaz.

Bu kullanıcının şifresini değiştirmesini istiyorum. 'Net user' komutu, kullanıcı kendi şifresini değiştirmeye çalışsa bile yönetici hakları gerektirir.

Standart bir kullanıcı şifresini komut satırından nasıl değiştirebilir?

Yanıtlar:


18

Etki alanı hesaplarıyla aradığınızı yapmak için bazı PowerShell kodu:

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)

ASDI sağlayıcısı WinNT://computername/username, ChangePassword()yöntemin sözdizimini de destekler . Ancak ADSystemInfonesne, makine yerel hesapları için çalışmaz, bu nedenle yukarıdaki kodu sadece WinNT://...sözdizimi ile uyarlamak uygulanabilir değildir.

(Yerel ve alan adı hesapları arasında ayrım yapmak için bir kod w / düzenleme önermek isteyen var mı?)

Tamamen farklı bir çakışmada, eski NetUserChangePasswordAPI yerel (ve etki alanı, NetBIOS sözdiziminde etki alanı adını belirtmeniz koşuluyla) hesaplarında da çalışır:

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)

Bu kod, yerel makinedeki bir şifreyi değiştirdiğinizi varsayar (".").


1
Beni dövüyorsun, ama karakterlerin korunması için kazanıyorum;) Kullandığın ekstra parçaların gerekli olduğunu bilmenin herhangi bir nedeni var mı? Yoksa daha resmi ve doğru olmak için mi?
charleswj81

1
Kesinlikle kod golf ödülünü alırsınız. Ben sadece resmi ve uygunum ... Aslında, senaryoyu kes ve yapıştır tipi olabilecek başkaları için biraz daha kullanışlı hale getiriyor.
Evan Anderson

1
@ charleswj81 - Evan'ın cevabı çok daha eksiksiz. PS1Parametreli veya parametresiz çağrılabilen bağımsız bir komut dosyasıdır. Çok daha okunabilir. Kod, insanların bilgisayarı değil başka birinin yazdıklarını anlamasıyla ilgilidir. Her iki çözüm de diğerinden daha hızlı olmayacaktır.
Mark Henderson

1
Bu umut verici görünüyor, ancak hesabın sistem için yerel olduğunu açıklığa kavuşturmalıyım. Aşağıdakileri denedim: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS") Ancak bu 'Parola parola ilkesi gereksinimlerini karşılamıyor ...' döndürdü. Yeni şifre bu gereksinimleri karşılıyor.
elijahbuck

1
Aslında, kullanıcıyı 'Uzak Masaüstü Kullanıcıları'na ekledikten ve şifre değişikliğini bu şekilde denedikten sonra aynı hatayı alıyorum. Yerel bir hesabı değiştirmenin doğru yolunun olduğuna inanıyorum: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
elijahbuck

9

PowerShell'de bu aslında oldukça basit:

([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')

3

Etki alanına katılmamış bir yerel yöneticinin parolasını değiştirmek için yukarıdaki cevapların hiçbirini boşuna denedim. Yorumlar üzerinden kazmak olsa gerek ne verdi.

Şu anda kabul edilen cevabın ikinci kısmı için long, booldönüş değeri yerine kullanılacak imzayı güncellemek istiyorsunuz ve bunlar sistem hata kodları belgelerinde giderilebilir . Sonuç olarak:

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)

Ancak, bu benim için işe yaramadı . Hata kodları, parametreleri nasıl kurduğuma bağlı olarak 86 ile 2221 arasında değişiyordu. Yorumlardan vazgeçmek ve daha fazla araştırmak üzereydim ve sonunda bunu başardık:

([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS‌​", "NEWPASS")

Powershell'de yerel bir yönetici şifresinin basit bir şekilde değiştirilmesinin çok karmaşık olması kesinlikle çok saçma. Güvenli dizeleri sisteminizde saklıyorsanız, eski parolayı girerek parolanın güncellenmesi veya bu güvenli dizelerin şifresini çözme riskini kaybetme riski ortadan kaldırılmalıdır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.