测试用户是否在本地存在总是返回false

时间:2012-06-20 14:06:22

标签: powershell

我正在尝试编写一个自定义PowerShell脚本,如果没有指定名称的用户,则会创建本地用户。

我有这个脚本:

function Ensure-LocalUser
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string] $userName,
        [Parameter(Mandatory=$true)]
        [string] $passWord
    )
    process{

        $objOu = [ADSI]"WinNT://${env:Computername}"
        $localUsers = $objOu.Children | where {$_.SchemaClassName -eq 'user'}  | Select {$_.name[0].ToString()} 

        if($localUsers -NotContains $userName)
        {
            $objUser = $objOU.Create("User", $userName)
            $objUser.setpassword($password)
            $objUser.SetInfo()
            $objUser.description = "CMM Test user"
            $objUser.SetInfo()

            return $true
        }
        else
        {
            return $false
        }

    }
}

与创建用户相关的部分有效,但我的-NotContains验证始终返回false。这导致尝试创建用户失败,因为用户已经存在。使用调试器,我可以看到$ localusers实际上包含我正在寻找的用户名。

如何更正我的脚本以达到目标?

3 个答案:

答案 0 :(得分:3)

更改此行

localUsers = $objOu.Children | where {$_.SchemaClassName -eq 'user'}  | Select {$_.name[0].ToString()} 

$localUsers = $objOu.Children | where {$_.SchemaClassName -eq 'user'}  | % {$_.name[0].ToString()}

答案 1 :(得分:3)

你做错了;)你真的想要这个(它将创建一个字符串数组):

$ou.Children | where {$_.SchemaClassName -eq 'user'}  | foreach {
      $_.name[0].tostring() }

您的代码正在创建一个自定义对象,其属性名为“$ _。name [0] .ToString()”

答案 2 :(得分:1)

在PowerShell 5.1(Windows 10中提供)及更高版本中,我们可以使用两个cmdlet来检查本地用户是否存在以及创建新的本地用户:Get-LocalUserNew-LocalUser。 所以我们可以用更紧凑的方式重写上面的函数:

function Ensure-LocalUser
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string] $userName,
        [Parameter(Mandatory=$true)]
        [string] $passWord
    )
    process{
        $out = Get-LocalUser -Name $userName -ErrorAction SilentlyContinue
        if($out -eq $null)
        {
            $passEnc = ConvertTo-SecureString -String $passWord -AsPlainText -Force
            New-LocalUser -Name $userName -Password $passEnc -AccountNeverExpires -PasswordNeverExpires
            return $true
        }
        else
        {
            write-host ("User '"+ $userName + "' already exists")
            return $false
        }
    }
}

然后调用这个函数:

Ensure-LocalUser "john" "p@ssw0rd"