2

すべてのサーバーでローカル ユーザーを作成しようとしていますが、これをスケジュールされたタスクとしてスケジュールして、作成されたすべての新しいサーバーを継続的にキャプチャして実行できるようにします。

アカウントの存在を確認し、真の場合はスキップできるようにしたい。false の場合、アカウントを作成します。

サーバー上のすべてのローカル アカウントを返すことができる getlocalAccount.psm1 というモジュールと、問題なく機能するローカル アカウントを追加できる Add-LocaluserAccount という別の関数をインポートしました。

スクリプトを実行しようとすると、作成したスクリプトは実行されますが、アカウントは追加されません

Import-Module "H:\powershell scripts\GetLocalAccount.psm1"

Function Add-LocalUserAccount{
    [CmdletBinding()]
    param (
        [parameter(ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [string[]]$ComputerName=$env:computername,
        [parameter(Mandatory=$true)]
        [string]$UserName,
        [parameter(Mandatory=$true)]
        [string]$Password,
        [switch]$PasswordNeverExpires,
        [string]$Description
    )

    foreach ($comp in $ComputerName){

        [ADSI]$server="WinNT://$comp"
        $user=$server.Create("User",$UserName)
        $user.SetPassword($Password)

        if ($Description){
            $user.Put("Description",$Description)
        }
        if ($PasswordNeverExpires){
            $flag=$User.UserFlags.value -bor 0x10000
            $user.put("userflags",$flag)
        }
        $user.SetInfo()
    }
}

$usr = "icec" 
$rand = New-Object System.Random

$computers = "ServerA.","ServerB","Serverc","ServerD","ServerE"

Foreach ($Comp in $Computers){
    if (Test-Connection -CN $comp -Count 1 -BufferSize 16 -Quiet){ 

        $admin = $usr + [char]$rand.next(97,122) + [char]$rand.next(97,122) + [char]$rand.next(97,122) + [char]$rand.next(97,122) 
        Get-OSCLocalAccount -ComputerName $comp | select-Object {$_.name -like "icec*"} 
        if ($_.name -eq $false) { 
            Add-LocalUserAccount -ComputerName $comp -username $admin -Password "password" -PasswordNeverExpires 
        }
        Write-Output "$comp online $admin"
    } Else {
        Write-Output "$comp Offline"
    }
}
4

3 に答える 3

0

次のように、ローカル アカウントを簡単に確認できます。

Get-WmiObject Win32_UserAccount -Filter "LocalAccount='true' and Name='Administrator'"

それらが既に存在する場合は、エラーを出力する (Write-Error "User $UserName Already exists") か、警告を書き込む (Write-Warning "User $UserName Already exists") か、単に黙ってオプションをスキップすることができます。

-ErrorAction SilentlyContinue は使用しないでください。これまで。将来のバグを隠し、探しに行くときにイライラします。

于 2013-11-02T21:01:36.730 に答える
0

なぜわざわざチェックするのですか?既に存在するアカウントを作成することはできません。エラーが表示されます。また、ユビキタス-ErrorActionパラメータを使用すると、スクリプトを使用するなど、どのように処理する必要があるかを判断できますContinue。さらに、try-catch ブロックを使用してこれらの例外を適切に処理し、より優れた出力/ログ オプションを提供できます。

特定のスクリプトに関して、実際に受け取ったエラーを提供してください。エラーが返されず、アクションが実行されない場合は、次の点を確認してください。

  • ターゲット コンピューターのイベント ログ
  • スクリプトで使用するコマンドレットの結果-Verboseまたは出力-Debug
  • ProcMon などで、どのようなシステム コールが発生したかを確認します。

ちなみに、投稿に v2 と v3 のタグを付けないでください。v2 互換の回答が必要な場合は、v2 でタグ付けしてください。「powershell」という単語が含まれるすべてのタグを重ねても、質問への回答が速くなったり効果的になったりすることはありません。

于 2013-10-31T17:01:18.910 に答える
0

これは、1 行で非常に簡単に実行できます。

Get-LocalUser 'username'

したがって、ifステートメントとしてそれを行うには:

if((Get-LocalUser 'username').Enabled) { # do something }

ローカル ユーザーが不明な場合は、すべてのユーザーを一覧表示できます。

Get-LocalUser *

ユーザーがそのリストにない場合、そのユーザーはローカル ユーザーではなく、おそらく別の場所を探す必要があります (例: Local Groups / AD Users / AD Groups)

それらを検索するための同様のコマンドがありますが、ここでは概説しません。

于 2018-08-23T16:37:59.973 に答える