ব্যবহারকারী পাসওয়ার্ড ইনপুট পাওয়ারশেল স্ক্রিপ্টে বৈধ কিনা তা পরীক্ষা করে দেখুন


30

আমি একটি পাওয়ারশেল স্ক্রিপ্ট নিয়ে কাজ করছি যা আমাদের ডোমেনের সিস্টেমে তফসিলযুক্ত কাজগুলি যুক্ত করে। আমি যখন এই স্ক্রিপ্টটি চালাব, এটি আমার পাসওয়ার্ডের জন্য আমাকে অনুরোধ করবে। আমি মাঝে মাঝে পাসওয়ার্ডটি ফ্যাট করে এবং প্রক্রিয়া শুরু হয়, যা আমার অ্যাকাউন্টটি লক করে দেয়। আমি যা টাইপ করেছি তাতে ডোমেনের সাথে বৈধতা পাওয়া যাবে কিনা তা নিশ্চিত করার জন্য আমার শংসাপত্রগুলি যাচাই করার কোনও উপায় আছে?

আমি ডোমেন নিয়ামককে জিজ্ঞাসা করার জন্য একটি উপায় খুঁজতে চাই। আমি কিছু গুগল অনুসন্ধান করেছি এবং আমার একটি ত্রুটির জন্য ডাব্লুএমআই কোয়েরি করতে এবং ফাঁদে ফেলতে সক্ষম হওয়া উচিত। আমি যদি সম্ভব হয় তবে বৈধতার এই স্টাইলটি এড়াতে চাই।

কোন ধারনা? আগাম ধন্যবাদ.

উত্তর:


26

আমার লাইব্রেরিতে এটি আছে:

$cred = Get-Credential #Read credentials
 $username = $cred.username
 $password = $cred.GetNetworkCredential().password

 # Get current domain using logged-on user's credentials
 $CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName
 $domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,$UserName,$Password)

if ($domain.name -eq $null)
{
 write-host "Authentication failed - please verify your username and password."
 exit #terminate the script.
}
else
{
 write-host "Successfully authenticated with domain $domain.name"
}

1
যদি আমি ভুল না হয়ে থাকি তবে এটি পুরোপুরি পুরো নেটওয়ার্ক জুড়ে পাসওয়ার্ডটি পাঠিয়ে দেবে, তাই না? যদি তা হয়, তবে আমি কি ধরে নিচ্ছি যে AccountManagement.PrincipalContext.ValidateCredentials()এটি না হয় ঠিক (আপনি যদি পাসওয়ার্ডের জন্য সুরক্ষিত স্ট্রিং সরবরাহ করেন)?
কোড জকি

আপনি কেন ActiveDirectoryআপনার এলডিএপি কোয়েরি করতে মডিউলটি ব্যবহার করছেন না ?
কলব ক্যানিয়ন

6 বছর আগে কোনও সক্রিয় ডিরেক্টরি মডিউল ছিল না
জিম বি

এই স্ক্রিপ্টটি এমন পরিস্থিতিতেও সহায়তা করে যেখানে আপনি কোনও কারণে বা অন্য কারণে AD পাওয়ারশেল মডিউল ইনস্টল করতে পারবেন না।
ডডজি জাজকুমা

16

অতীতে আমি এটি ব্যবহার করেছি; এটি স্থানীয় মেশিন অ্যাকাউন্ট এবং 'অ্যাপ্লিকেশন ডিরেক্টরি' এর জন্য কাজ করার কথা, তবে এখনও পর্যন্ত আমি এটি AD শংসাপত্রগুলির সাথে সফলভাবে ব্যবহার করেছি:

    function Test-Credential {
    <#
    .SYNOPSIS
        Takes a PSCredential object and validates it against the domain (or local machine, or ADAM instance).

    .PARAMETER cred
        A PScredential object with the username/password you wish to test. Typically this is generated using the Get-Credential cmdlet. Accepts pipeline input.

    .PARAMETER context
        An optional parameter specifying what type of credential this is. Possible values are 'Domain','Machine',and 'ApplicationDirectory.' The default is 'Domain.'

    .OUTPUTS
        A boolean, indicating whether the credentials were successfully validated.

    #>
    param(
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [System.Management.Automation.PSCredential]$credential,
        [parameter()][validateset('Domain','Machine','ApplicationDirectory')]
        [string]$context = 'Domain'
    )
    begin {
        Add-Type -assemblyname system.DirectoryServices.accountmanagement
        $DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::$context) 
    }
    process {
        $DS.ValidateCredentials($credential.UserName, $credential.GetNetworkCredential().password)
    }
}

আমি যদি কেউ এটি খেয়াল করে তবে শুনতে আগ্রহী - আমি বিশ্বাস করি যে আমি যখন ভুল পাসওয়ার্ড দিয়ে এইভাবে ভ্যালিডেট ক্রেডিটেনশিয়াল () ব্যবহার করি তখন মনে হয় এটি দুটি (২) খারাপ পাসওয়ার্ড প্রচেষ্টা সঞ্চারিত করে - আমি চেষ্টা করার সংখ্যাটি নিয়ন্ত্রণ করতে পারি না আমাদের ডোমেনে, এবং এটি কম, তাই আমি যখন একটি একক কল করার সময় দুটি খারাপ প্রচেষ্টা না করাই পছন্দ করি ... কেউ কি এটিও দেখতে পাবে?
কোড জকি

আপনি কি ডোমেন \ ব্যবহারকারী বা ইউপিএন (ব্যবহারকারী @ ডোমেন) ফর্ম্যাট ব্যবহার করছেন? আমি এটির
vstudio

আপনি ঠিক $contextকনস্ট্রাক্টরের পক্ষে যুক্তি হিসাবে পাস করতে সক্ষম হওয়া উচিত । পাওয়ারশেল স্বয়ংক্রিয়ভাবে স্ট্রিংগুলিকে একটি এনামে রূপান্তর করবে। আরও ভাল, শুধু [System.DirectoryServices.AccountManagement.ContextType]টাইপ করুন $context। এছাড়াও, আপনি এখানে beginএবং কেন ব্যবহার করছেন process? পাইপলাইনটি এই ফাংশনটি ব্যবহার করার মতো একটি বিজোড় উপায় বলে মনে হচ্ছে।
jpmc26

@ jpmc26: $contextপ্যারামিটারটি টাইপ করা [System.DirectoryServices.AccountManagement.ContextType]কোনও বিকল্প নয়, কারণ ফাংশন বডিটি কার্যকর না হওয়া পর্যন্ত উপস্থিত সমাবেশটি লোড হয় না ; আপনি একাধিক শংসাপত্রগুলি বৈধ করতে চাইলে পাইপলাইনটি ব্যবহার করা সহায়ক।
এমকিলেমেন্ট

@ এমকিলেমেন্ট Add-Typeএর সংজ্ঞা কার্যকর হওয়ার আগে কলটি ফাংশনের বাইরে সরানো যাবে না এর কোনও কারণ নেই । আমি Add-Typeফাংশনটির মধ্যে ইতিমধ্যে লোড হওয়া সত্ত্বেও, নিঃশর্তভাবে বার বার কল করতে দ্বিধা বোধ করছি । এক সাথে একাধিক শংসাপত্রের বৈধতা দেওয়া প্রথম স্থানে একটি বিজোড় পরিস্থিতি বলে মনে হয়। বিরল ক্ষেত্রে এটি যা আপনি চান, আপনি সহজেই কলটি গুটিয়ে রাখতে পারেন ForEach-Object, সুতরাং এতে ফাংশনটি জটিল করার কোনও কারণ আমি দেখতে পাচ্ছি না।
jpmc26

1

আমি এই পোস্টটিকে দরকারী বলে মনে করেছি তবে এটি আমার সমস্যার সমাধান করতে পারেনি কারণ আমি স্থানীয় এডমিন অ্যাকাউন্টে লগ ইন করে এটি কোনও স্ক্রিপ্ট থেকে চালানোর চেষ্টা করছিলাম। এটি স্থানীয় প্রশাসক হিসাবে কাজ করছে বলে মনে হয় না (কেবলমাত্র কোনও ডোমেন ব্যবহারকারী হিসাবে লগইন হয়ে থাকে)।

তবে অবশেষে আমি একটি কার্যক্ষম সমাধান পেতে পরিচালিত করেছিলাম এবং যেহেতু এটি এতটা সমস্যা ছিল আমি ভেবেছিলাম যে আমি এটি এখানে ভাগ করছি তাই এই সমস্যাটির সাথে অন্য কারও উত্তর ঠিক আছে here আপনার প্রয়োজনের উপর নির্ভর করে এক পৃষ্ঠায় উভয় উত্তর।

নোট করুন যে স্কিপটিতে উচ্চতর (এটি কেবল গেট-শংসাপত্র বিভাগ হিসাবে এখানে অন্তর্ভুক্ত নয়) পাওয়ারগুই ইনস্টল করা আছে এবং নীচের এই কোডটির জন্য প্রয়োজনীয়তা রয়েছে (পাশাপাশি "অ্যাড-পিএসএসএনপিন কোয়েস্ট।অ্যাক্টিভরোলস। অ্যাড ম্যানেজমেন্ট" লাইন)। পাওয়ারগুই কী আলাদা তা নিশ্চিত না তবে অন্য কেউ আমাকে জানাতে পারেনি এবং এটি কাজ করে।

"ডোমেন_নাম" বিভাগগুলিতে আপনার নিজের ডোমেন নামটি সাবস্ক্রাইব করুন।

#Get credentials
$credential_ok = 0
while ($credential_ok -ne 1)
{
    $credential = get-credential
    $result = connect-qadservice -service *domain_name* -credential $credential
    [string]$result_string = $result.domain
    if ($result_string -eq "*domain_name*")
    {
        $credential_ok = 1
        #authenticated
    }
    else
    {
        #failed
    }     
}
$username = $credential.username 
$password = $credential.GetNetworkCredential().password 

$date = get-date
Add-Content "c:\lbin\Install_log.txt" "Successfully authenticated XP script as $username $date"

1

(এখনও) অন্য সংস্করণ:

param([string]$preloadServiceAccountUserName = "")

function HarvestCredentials()
{

        [System.Management.Automation.PSCredential]$credentialsOfCurrentUser = Get-Credential -Message "Please enter your username & password" -UserName $preloadServiceAccountUserName

        if ( $credentialsOfCurrentUser )
        {
            $credentialsOfCurrentUser = $credentialsOfCurrentUser
        }
        else
        {
            throw [System.ArgumentOutOfRangeException] "Gui credentials not entered correctly"          
        }

    Try
    {


        # see https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.path(v=vs.110).aspx
        # validate the credentials are legitimate
        $validateCredentialsTest = (new-object System.DirectoryServices.DirectoryEntry ("WinNT://"+$credentialsOfCurrentUser.GetNetworkCredential().Domain), $credentialsOfCurrentUser.GetNetworkCredential().UserName, $credentialsOfCurrentUser.GetNetworkCredential().Password).psbase.name
        if ( $null -eq  $validateCredentialsTest)
        {
            throw [System.ArgumentOutOfRangeException] "Credentials are not valid.  ('" + $credentialsOfCurrentUser.GetNetworkCredential().Domain + '\' + $credentialsOfCurrentUser.GetNetworkCredential().UserName + "')"
        }
        else
        {
            $t = $host.ui.RawUI.ForegroundColor
            $host.ui.RawUI.ForegroundColor = "Magenta"
            Write-Output "GOOD CREDENTIALS"
            $host.ui.RawUI.ForegroundColor = $t
        }
    }
    Catch
    {

        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        $StackTrace = $_.Exception.StackTrace

        $t = $host.ui.RawUI.ForegroundColor
        $host.ui.RawUI.ForegroundColor = "Red"

        Write-Output "Exception - $ErrorMessage"
        Write-Output "Exception - $FailedItem"
        Write-Output "Exception - $StackTrace"

        $host.ui.RawUI.ForegroundColor = $t

        throw [System.ArgumentOutOfRangeException] "Attempt to create System.DirectoryServices.DirectoryEntry failed.  Most likely reason is that credentials are not valid."
    }

}


Try
{

    HarvestCredentials

}
Catch
{
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    $StackTrace = $_.Exception.StackTrace

    $t = $host.ui.RawUI.ForegroundColor
    $host.ui.RawUI.ForegroundColor = "Red"

    Write-Output "Exception - " + $ErrorMessage
    Write-Output "Exception - " + $FailedItem
    Write-Output "Exception - " + $StackTrace

    $host.ui.RawUI.ForegroundColor = $t

    Break
}
Finally
{
    $Time=Get-Date
    Write-Output "Done - " + $Time
}

এবং

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