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

Powershell 测试用户是否在本地存在总是返回false,powershell,Powershell,我正在尝试编写一个自定义powershell脚本,如果不存在具有指定名称的用户,该脚本将创建本地用户 我有这个剧本: function Ensure-LocalUser { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] $userName, [Parameter(Mandatory=$true)] [string] $passWord

我正在尝试编写一个自定义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
        }

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

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

更改此行

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

你做错了;)您确实希望这样(这将创建一个字符串数组):

您的代码正在使用PowerShell 5.1(在Windows 10中提供)和更高版本中名为“$\u.name[0].ToString()”

的属性创建自定义对象。我们可以使用两个cmdlet来检查本地用户的存在性和创建新的本地用户:
获取本地用户
新建本地用户
。 因此,我们可以以更紧凑的方式重写上述函数:

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
        }
    }
}
然后像这样调用函数:


确保本地用户“john”p@ssw0rd“

这解决了我的问题。但是我不明白其中的区别。
Select Object
命令不是投影脚本块的结果吗?当我在PowerShell ISE的即时窗口中键入
$localUsers
时,我可以看到System.Array中的值。@x0n如何编写:您的$localUsers是一个PscustomObject。要使用-contains,您需要一个字符串数组来与$username之类的字符串进行比较。@Christian-contains在技术上适用于任何对象,而不仅仅是字符串-只是他的用法需要字符串,因为右值操作数是字符串。@x0n。是的,我知道,我的英语不好。。。用“像$username这样的字符串”我是说你在说什么!谢谢你的回答,这个答案确实有效。我将为Christian的一个做标记,因为他是第一个提出解决方案的人。
$ou.Children | where {$_.SchemaClassName -eq 'user'}  | foreach {
      $_.name[0].tostring() }
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
        }
    }
}