একটি আদর্শ উইন্ডোজ ব্যবহারকারী কীভাবে কমান্ড লাইন থেকে তাদের পাসওয়ার্ড পরিবর্তন করতে পারেন?


18

উইন্ডোজ সার্ভার ২০০৮ আর 2 এ, আমার কাছে একটি স্ট্যান্ডার্ড (অ-প্রশাসক) স্থানীয় ব্যবহারকারী রয়েছে (একটি অ্যাক্টিভ ডিরেক্টরি অ্যাকাউন্ট নয়, যদিও সার্ভারটি একটি ডোমেনে রয়েছে) কেবলমাত্র পাওয়ারশেল রিমোটিংয়ের মাধ্যমে সার্ভারটিতে অ্যাক্সেস রয়েছে। ব্যবহারকারী আরডিপির মাধ্যমে লগইন করতে পারবেন না।

আমি চাই এই ব্যবহারকারী তাদের পাসওয়ার্ড পরিবর্তন করতে সক্ষম হন। 'নেট ব্যবহারকারী' কমান্ডের প্রশাসকের অধিকার প্রয়োজন, এমনকি যদি ব্যবহারকারী তাদের নিজস্ব পাসওয়ার্ড পরিবর্তন করার চেষ্টা করে।

কমান্ড লাইন থেকে কোনও মানক ব্যবহারকারী কীভাবে তাদের পাসওয়ার্ড পরিবর্তন করতে পারেন?

উত্তর:


18

আপনি ডোমেন অ্যাকাউন্টগুলির সাথে যা খুঁজছেন তা করার জন্য এখানে কিছু পাওয়ারশেল কোড রয়েছে:

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://...সিনট্যাক্স কার্যকর নয়।

(স্থানীয় এবং ডোমেন অ্যাকাউন্টের মধ্যে পার্থক্য করার জন্য যে কেউ ডাব্লু / কোড সম্পাদনার পরামর্শ দিতে চান?)

সম্পূর্ণ আলাদা ট্যাক্সে, পুরানো NetUserChangePasswordএপিআই স্থানীয় (এবং ডোমেনের সাথে কাজ করবে, তবে আপনি নেটবিআইওএস সিনট্যাক্সে ডোমেনের নামটি নির্দিষ্ট করেছেন), এছাড়াও:

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
আপনি অবশ্যই কোড গল্ফ পুরষ্কার পাবেন। আমি কেবল ওল 'আনুষ্ঠানিক এবং যথাযথ ... আসলে, এটি সাধারণত স্ক্রিপ্টটি অন্যদের জন্য আরও বেশি ব্যবহারযোগ্য করে তোলে যা সম্ভবত কাটা-পেস্ট ধরণের হতে পারে।
ইভান অ্যান্ডারসন

1
@ Charleswj81 - ইভানের উত্তরটি আরও সম্পূর্ণ। এটি একটি স্বতন্ত্র PS1স্ক্রিপ্ট যা পরামিতিগুলির সাথে বা তার پرته কল করা যেতে পারে। এটি অনেক বেশি পাঠযোগ্য। কোড কম্পিউটারে নয়, অন্য কেউ কী লিখেছেন সেগুলি বোঝার জন্য কোডগুলি সমস্ত কিছুই। কোনওটির সমাধান অন্যের চেয়ে দ্রুততর হবে না।
মার্ক হেন্ডারসন

1
এটি আশাব্যঞ্জক দেখাচ্ছে, তবে আমার স্পষ্ট করে বলা উচিত যে অ্যাকাউন্টটি সিস্টেমে স্থানীয়। আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS") তবে এটি 'পাসওয়ার্ডের সাথে পাসওয়ার্ড নীতিের প্রয়োজনীয়তা মেলে না ...' ফিরে এসেছে returned নতুন পাসওয়ার্ড যদিও সেই প্রয়োজনীয়তাগুলি পূরণ করে।
এলিজবুক

1
আসলে, ব্যবহারকারীকে 'রিমোট ডেস্কটপ ব্যবহারকারীগণ' এ যুক্ত করার পরে এবং পাসওয়ার্ডটি সেভাবে পরিবর্তন করার চেষ্টা করার পরে আমি একই ত্রুটি পেয়েছি। আমি বিশ্বাস করি যে স্থানীয় অ্যাকাউন্ট পরিবর্তন করার সঠিক উপায় হ'ল: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
এলিজবাক

9

এটি পাওয়ারশেলের ক্ষেত্রে আসলে বেশ সহজ:

([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")

একেবারে হাস্যকর যে কোনও স্থানীয় অ্যাডমিন পাসওয়ার্ডের সরল পরিবর্তনটি পাওয়ারশেলের ক্ষেত্রে এত জটিল। আপনি যদি আপনার সিস্টেমে সুরক্ষিত স্ট্রিংগুলি সঞ্চয় করেন তবে পাসওয়ার্ডটি আপডেট করা অবশ্যই পুরানো পাসওয়ার্ড সরবরাহ করেই করা উচিত, বা সেই সুরক্ষিত স্ট্রিংগুলি সঠিকভাবে ডিক্রিপ্ট করার ক্ষমতা হারাতে হবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.