اعتقدت أنني جيد جدًا في powershell ، لكن لم يكن عليّ أبدًا العمل مع بيانات اعتماد المستخدم. ومع ذلك ، أنا الآن في بحث عن وظيفة ، وفي إحدى المقابلات ، تم تكليفي بمهمة اختبار لكتابة نص من المفترض أن:
- تحقق من توفر وحالة (تمكين / تعطيل) حساب المستخدم.
- تحقق مما إذا كان الحساب مضمنًا في مجموعة المسؤولين
- إذا لم يكن هناك حساب ، فقم بإنشاء حساب وإضافته إلى مجموعة المسؤولين ، وحدد المربعين "منع تغيير كلمة مرور المستخدم" و "كلمة المرور غير منتهية الصلاحية"
- إذا كان الحساب موجودًا ، ولكن تم تعطيله أو لم يتم تضمينه في مجموعة المسؤولين ، فقم بتمكين الحساب وإضافته إلى مجموعة المسؤولين ، وحدد المربعات بجوار "رفض تغيير كلمة المرور بواسطة المستخدم" و "كلمة المرور غير منتهية الصلاحية"
- يجب ألا يعتمد البرنامج النصي على لغة نظام التشغيل.
اعتقدت أنه لا يوجد شيء معقد ، وأول شيء قررت التحقق منه هو مستخدم المسؤول على جهاز الكمبيوتر الخاص بي. دون التفكير مرتين ، قدت أمرًا:
Get-User admin
ثم حصلت على خطأ
Get-User : "Get-User" , , .
فوجئت قليلاً لأنني لم أتعرف على مثل هذا الأمر المفيد ووجدت أن الأمر
Get-User يعمل فقط في وحدة تحكم Powershell لـ Exchange. للعمل مع المستخدمين المحليين ، يجب عليك استخدام
Get-Localuser ولمستخدمي المجال
Get-Aduser . أدركت خطئي ، قدت في:
Get-Localuser admin
وحصلت على إجابة
Name Enabled Description
حسنًا ، الآن ليس من الصعب التحقق مما إذا كان المستخدم موجودًا أم لا ، ولكن هنا مرة أخرى كنت في انتظار التقاط آخر. إن استخدام الشرط إذا لم يكن الأمر سهلاً.
والحقيقة هي أنه إذا كان المستخدم في النظام ، فإن الناتج ليس القيمة الحقيقية ، ولكن مجموعة كاملة من البيانات ، مع اسم المستخدم ووصفه ، يتم تمكين هذا الحساب أم لا. وإذا لم يكن هناك مستخدم ، فإن powerhell يلقي خطأ. بعد التجول في الإنترنت ، وجدت أنه من الأفضل لهذه الأغراض استخدام عامل استخدام
try .
$user = 'admin' try { Get-LocalUser $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red }
أضفت متغير المستخدم $ لتسهيل تغيير أسماء المستخدمين في البرنامج النصي بأكمله. ErrorAction Stop ضروري حتى لا يقاطع البرنامج النصي في هذه الخطوة بسبب خطأ. تسجيل | يفصل خطوات خط الأنابيب ، وسيخفي Out-Null إخراج نص الخطأ. أضفت أيضًا إخراج النص مع التمييز ، لتسهيل التحقق من البرنامج النصي.
بعد ذلك ، أردت التحقق مما إذا كان الحساب ممكّنًا أو معطلاً. كما قلت ، ينتج عن الأمر Get-LocalUser مجموعة كاملة من البيانات وللتحقق ، كنت بحاجة إلى تحديد معلمة ممكّنة واحدة فقط بقيمة صواب أو خطأ. للقيام بذلك ، استخدمت الأمر التالي:
(Get-LocalUser $user).enabled
بعد التأكد من أنه يعمل ، قمت بإجراء الفحص التالي وأضفت أمر تمكين المستخدم.
$user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green }
لتمكين المستخدم ، من الضروري بشكل طبيعي تشغيل وحدة التحكم بموجب حقوق المسؤول.
في الفقرة الثانية من المهمة ، كان من الضروري تحديد ما إذا كان المستخدم عضوًا في مجموعة المسؤولين. للتحقق مما إذا كان المستخدم في مجموعة معينة ، هناك أمر Get-LocalGroupMember. ومع ذلك ، يختلف اسم مجموعة المسؤولين عن لغة نظام التشغيل. لذلك ، كان علي استخدام معيار SID S-1-5-32-544. راجعت أيضا من خلال محاولة الصيد.
$user = 'admin' try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
إذا لم يكن المستخدم عضوًا في المجموعة ، فستتم إضافة المسؤولين إليها.
في المرحلة التالية ، كانت لدي مهمة تحديد ما إذا كان المستخدم لديه إعداد تغيير كلمة المرور معطلاً أم لا. ثم صادفت مطبات أخرى. والحقيقة هي أنه إذا كان لدى المستخدم كلمة مرور غير محدودة ، فإن معلمة PasswordExpires لا تُرجع أي قيم. وإذا تم تعطيل مربع الاختيار هذا ، فسيكون لدى المستخدمين المختلفين تاريخ مختلف لتغيير كلمة المرور. ما زلت أتوصل إلى مخرج من هذا الموقف:
if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green }
بعد ذلك ، احتجت إلى إنشاء مستخدم. لم أكن أتوقع أن ينتظرني صيد هنا أيضًا. عند إنشاء مستخدم بالأمر
new-LocalUser -User $user -password P@ssW0rD!
تم إرجاع الخطأ:
"Password". "P@ssW0rD!" "System.String" "System.Security.SecureString".
الحقيقة هي أن المعلمة -password يجب أن تستخدم SecureString ، بدلاً من السلسلة النصية المعتادة. للقيام بذلك ، قمت بعمل المتغير password password وقمت بتحويله إلى securestring.
$password = convertto-securestring "P@ssW0rD!" -asplaintext -force
والبرنامج النصي نفسه لإنشاء مستخدم وإضافته إلى مجموعة المسؤولين
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
النص النهائي الذي يأخذ في الاعتبار جميع الشروط التي حصلت عليها بهذه الطريقة:
$user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try { Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host $user -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green } if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green } try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green } } Catch { cls write-host $user -foregroundcolor Red new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
بعد البرنامج النصي
ومع ذلك ، فإن تخزين كلمة مرور المسؤول في برنامج نصي ليس أفضل ممارسات الأمان. للقيام بذلك ، يمكنك استخدام تجزئة كلمة المرور ، وليس كلمة المرور نفسها.
$user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
للحصول على تجزئة كلمة المرور ، يمكنك استخدام البرنامج النصي التالي
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
الذي يطلب كلمة مرور من لوحة المفاتيح.
ومكافأة صغيرة لعرض جميع السجلات المعطلة
Get-LocalUser | Where-Object {$_.enabled -eq $false}
آمل أن يساعد الوقت الذي قضيته شخصًا في عمله. ومن المفيد لك ألا تنسى هذه التجربة التي لا تقدر بثمن.