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

You can do a quick check for a local account like so:

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

If they already exist, you can either output an error (Write-Error "User $UserName Already exists"), write a warning (Write-Warning "User $UserName Already exists"), or simply silently skip the option.

Please don't use -ErrorAction SilentlyContinue. Ever. It will hide future bugs and frustrate you when you go looking for them.

于 2013-11-02T21:01:36.730 回答
0

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

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

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

在旁注中,请不要使用 v2 和 v3 标记您的帖子。如果您需要与 v2 兼容的答案,请使用 v2 对其进行标记。堆放所有带有“powershell”一词的标签不会更快或更有效地回答问题。

于 2013-10-31T17:01:18.910 回答
0

这可以很容易地在一行中完成:

Get-LocalUser 'username'

因此,将其作为一个if声明:

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

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

Get-LocalUser *

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

有类似的命令可以查找它们,但我不会在这里概述它们

于 2018-08-23T16:37:59.973 回答