使用Powershell检查本地用户帐户/组是否存在

时间:2018-04-01 05:09:31

标签: powershell

这个问题分为两部分。

  1. 在我继续创建之前,我想检查本地用户是否存在。 到目前为止,我已经提出了一个简单的脚本来检查本地用户是否存在。这是在我继续创建之前检查用户是否存在的脚本。
  2. $password = ConvertTo-SecureString -String "password" -AsPlainText -Force
    $op = Get-LocalUser | Where-Object {$_.Name -eq "testuser1"}
    if ( -not $op)
     {
      New-LocalUser testuser1 -Password $password | Out-Null
     }
    

    我在我的设置上测试了这个,它在大多数情况下工作正常,没有任何异常。是否有更好,更快的方法来检查用户是否存在?此外,我使用的脚本是否万无一失,即使用 ErrorAction 或使用 try .... catch 处理它会更好吗?

    在我继续创建之前,我将使用此脚本检查多个用户帐户。

    1. 为什么在以下情况下$ op不同?
    2. 案例1

      enter image description here

      案例2

      enter image description here

      我知道 Out-String 是输出差异的原因,但我希望输出不仅仅是CASE 1中的 testuser1

      我是Powershell的新手,所以有人可以帮助我理解为什么输出会有差异吗?

3 个答案:

答案 0 :(得分:1)

Write-Host在幕后调用ToString()方法实现对象。

Write-Host $op 相当于

Write-Host $op.ToString()

Get-LocalUser | Where-Object {$_.Name -eq "testuser1"}会返回LocalUser个对象。 LocalUser.ToString()实施会返回Name属性,这就是您将testuser1视为输出的原因。

另一方面,

Out-String转换命令的整个输出,这是具有3个属性的LocalUser对象的表表示。

在案例2中,您只能将该输出用作String对象,而在案例1中,$op是一个LocalUser对象,您可以操作或访问属性。例如,您可以打印更多属性:

Write-Host $op.Name, $op.Enabled, $op.Description

要查看对象上可用的所有属性/方法,请运行Get-Member cmdlet:

$op | Get-Member

答案 1 :(得分:1)

您可以使用度量来检查用户是否存在

$op = Get-LocalUSer | where-Object Name -eq "yourusername" | Measure
if ($op.Count -eq 0) {
     # DO SOMETHING
} else {
     # REPORT SOMETHING
}

答案 2 :(得分:0)

使用Try / Catch,大多数情况下只需要提问并让Powershell处理搜索就更快;)

特别是对于长用户列表,检索所有用户然后迭代所有用户会减慢速度,只是要求特定用户更快,但如果用户不存在则需要处理错误。

见下面的例子:

Clear-Host
$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'

#User to search for
$USERNAME = "TestUser"

#Declare LocalUser Object
$ObjLocalUser = $null

Try {
    Write-Verbose "Searching for $($USERNAME) in LocalUser DataBase"
    $ObjLocalUser = Get-LocalUser $USERNAME
    Write-Verbose "User $($USERNAME) was found"
}

Catch [Microsoft.PowerShell.Commands.UserNotFoundException] {
    "User $($USERNAME) was not found" | Write-Warning
}

Catch {
    "An unspecifed error occured" | Write-Error
    Exit # Stop Powershell! 
}

#Create the user if it was not found (Example)
If (!$ObjLocalUser) {
    Write-Verbose "Creating User $($USERNAME)" #(Example)
    # ..... (Your Code Here)
}

关于输出某些数据,我建议您明确定义要输出的内容,这样就不会出现意外情况,这会使代码更加清晰。

请参阅下面的示例,我明确定义了我想要的3个属性,然后将其强制转换为表格视图,完成后我将其转换为字符串,所以对我来说不再有任何惊喜;)

Get-LocalUser | Select Name, Enabled, PasswordLastSet | Format-Table | Out-String

示例输出

Name               Enabled PasswordLastSet    
----               ------- ---------------    
Administrator        False                    
DefaultAccount       False                    
Gast                 False                    
Test-Gebruiker        True 24-12-2017 01:58:12