एक मानक विंडोज उपयोगकर्ता कमांड लाइन से अपना पासवर्ड कैसे बदल सकता है?


18

Windows Server 2008 R2 पर, मेरे पास एक मानक (गैर-प्रशासक) स्थानीय उपयोगकर्ता है (सक्रिय निर्देशिका खाता नहीं है, हालांकि सर्वर एक डोमेन में है) जिसके पास केवल PowerShell रीमोटिंग के माध्यम से सर्वर तक पहुंच है। उपयोगकर्ता RDP के माध्यम से लॉगिन नहीं कर सकता है।

मैं चाहूंगा कि यह उपयोगकर्ता अपना पासवर्ड बदलने में सक्षम हो। 'नेट यूजर' कमांड के लिए प्रशासक अधिकारों की आवश्यकता होती है, भले ही उपयोगकर्ता अपना पासवर्ड बदलने की कोशिश कर रहा हो।

एक मानक उपयोगकर्ता कमांड लाइन से अपना पासवर्ड कैसे बदल सकता है?

जवाबों:


18

डोमेन खातों के साथ आप जो देख रहे हैं, उसे करने के लिए कुछ PowerShell कोड यहां दिए गए हैं:

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 प्रदाता विधि के WinNT://computername/usernameलिए सिंटैक्स का भी समर्थन करता है ChangePassword()ADSystemInfoवस्तु, हालांकि, मशीन-स्थानीय खातों के लिए काम नहीं करेगा, तो बस कोड retrofitting के साथ ऊपर WinNT://...वाक्य रचना व्यावहारिक नहीं है।

(कोई भी स्थानीय और डोमेन खातों के बीच अंतर करने के लिए एक एडिट डब्ल्यू / कोड का सुझाव देना चाहता है?)

पूरी तरह से अलग व्यवहार पर, पुराना NetUserChangePasswordAPI स्थानीय (और डोमेन के साथ काम करेगा, बशर्ते कि आप NetBIOS सिंटैक्स में डोमेन नाम निर्दिष्ट करें) खाते:

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)

यह कोड मानता है कि आप स्थानीय मशीन ("") पर एक पासवर्ड बदल रहे हैं।


1
आप मुझे इसके लिए हरा देते हैं, लेकिन मैं पात्रों के संरक्षण के लिए जीता हूं?) किसी भी कारण से आपको पता है कि आपके द्वारा उपयोग किए जाने वाले अतिरिक्त हिस्से आवश्यक हैं? या सिर्फ अधिक औपचारिक और उचित होना?
charleswj81

1
आपको कोड गोल्फ अवार्ड जरूर मिलेगा। मैं सिर्फ ol 'औपचारिक और उचित हूं ... वास्तव में, यह मुख्य रूप से स्क्रिप्ट को दूसरों के लिए थोड़ा अधिक उपयोग करने योग्य बनाता है जो कट-एंड-पेस्ट प्रकार हो सकते हैं।
इवान एंडरसन

1
@ charleswj81 - इवान का जवाब रास्ता अधिक पूर्ण है। यह एक स्टैंडअलोन PS1स्क्रिप्ट है जिसे मापदंडों के साथ या बिना कॉल किया जा सकता है। यह बहुत अधिक पठनीय है। कोड सभी मनुष्यों को समझने के बारे में है कि किसी और ने क्या लिखा है, कंप्यूटर नहीं। न तो समाधान दूसरे की तुलना में तेज होगा।
मार्क हेंडरसन

1
यह आशाजनक लग रहा है, लेकिन मुझे यह स्पष्ट करना चाहिए कि खाता सिस्टम के लिए स्थानीय है। मैंने निम्नलिखित प्रयास किया: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS") लेकिन वह लौटा 'पासवर्ड नीति की आवश्यकताओं को पूरा नहीं करता है ...'। नया पासवर्ड हालांकि उन आवश्यकताओं को पूरा करता है।
एलिय्याहबक

1
दरअसल, यूजर को 'रिमोट डेस्कटॉप यूजर्स' में जोड़ने और पासवर्ड बदलने का प्रयास करने के बाद, मुझे वही त्रुटि मिलती है। मेरा मानना ​​है कि स्थानीय खाते को बदलने का सही तरीका है: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
एलिय्याहबक

9

यह वास्तव में PowerShell में बहुत सरल है:

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

3

मैंने किसी स्थानीय व्यवस्थापक के पासवर्ड को बदलने के लिए उपरोक्त दोनों उत्तरों की कोशिश की, जो कि डोमेन में शामिल नहीं हैं। टिप्पणियों के माध्यम से खुदाई करने से मुझे जो कुछ भी चाहिए था, वह मिल गया।

वर्तमान में स्वीकृत उत्तर के दूसरे भाग के लिए, आप वापसी मूल्य के longबजाय उपयोग करने के लिए हस्ताक्षर को अपडेट करना चाहते हैं bool, और इन्हें सिस्टम त्रुटि कोड डॉक्स पर समस्या निवारण किया जा सकता है । तो आप के साथ अंत:

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)

हालांकि, यह मेरे लिए काम नहीं किया । त्रुटि कोड 86 और 2221 के बीच वैकल्पिक है, इस पर निर्भर करता है कि मैंने पैरामीटर कैसे सेट किया। के बारे में टिप्पणी देने के लिए छोड़ दिया गया था, और अंत में सफलता मिली:

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

पूरी तरह से हास्यास्पद है कि एक स्थानीय व्यवस्थापक पासवर्ड का सरल परिवर्तन Powershell में बहुत जटिल है। यदि आप अपने सिस्टम पर सभी स्थानों पर securestrings संग्रहीत करते हैं, तो पासवर्ड को अपडेट करना पुराने पासवर्ड की आपूर्ति के साथ किया जाना चाहिए, या उन सुरक्षित तारों को ठीक से डिक्रिप्ट करने की क्षमता खोने का जोखिम!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.