如果为false,则需要检查是否存在帐户

时间:2013-10-31 16:36:12

标签: powershell powershell-v2.0

我正在尝试在所有服务器上创建本地用户,并且我希望将其安排为计划任务,以便它可以连续捕获所有创建的新服务器。

我希望能够检查帐户是否存在,如果是,请跳过;如果为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"
    }
}

3 个答案:

答案 0 :(得分:0)

为什么要费心检查?您无法创建已存在的帐户;你会收到一个错误。使用无处不在的-ErrorAction参数,您可以确定应该如何处理,例如使用脚本Continue。除此之外,您可以使用try-catch块来优雅地处理这些异常并提供更好的输出/日志记录选项。

关于您的具体脚本,请提供您收到的实际错误。如果它没有返回错误但不执行任何操作,请检查以下内容:

  • 目标计算机上的事件日志
  • 您在脚本中使用的cmdlet的-Verbose-Debug输出结果
  • ProcMon左右看看系统调用了什么,如果有的话。

在旁注中,请不要使用v2和v3标记您的帖子。如果您需要兼容v2的答案,请使用v2标记。在所有带有“powershell”字样的标签上打桩将无法更快或更有效地回答问题。

答案 1 :(得分:0)

您可以快速检查本地帐户,如下所示:

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

如果它们已经存在,您可以输出错误(写入错误“用户$ UserName已存在”),写入警告(写入警告“用户$ UserName已存在”),或者只是静静地跳过该选项。

请不要使用-ErrorAction SilentlyContinue。永远。当你去寻找它时,它会隐藏未来的错误并让你感到沮丧。

答案 2 :(得分:0)

这很容易在一行中完成:

Get-LocalUser 'username'

因此,要以if语句的形式进行操作:

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

如果不确定本地用户是什么,可以列出所有用户:

Get-LocalUser *

如果该用户不在该列表中,则该用户不是本地用户,您可能需要查找其他位置(例如,本地组/ AD用户/ AD组

有类似的命令可以查找这些内容,但我不会在此处概述它们