繁体   English   中英

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

[英]Checking if a local user account/ group exists or not with Powershell

这个问题有两个部分。

  1. 我想在 go 之前检查本地用户是否存在并创建它。 到目前为止,我已经想出了一个简单的脚本来检查本地用户是否存在。 这是用于检查用户在我 go 之前是否存在并创建它的脚本。
 $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 处理它更好吗?

在我提前 go 并创建它们之前,我将使用此脚本检查多个用户帐户。

  1. 为什么在以下情况下 $op 会有所不同?

情况1

在此处输入图像描述

案例二

在此处输入图像描述

我知道Out-String是 output 中这种差异背后的原因,但我预计 output 不仅仅是案例 1 中的testuser1

我是 Powershell 的新手,所以有人可以帮我理解为什么 output 有区别吗?

使用 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 个属性,然后将其强制转换为 Table-View,最后将其转换为字符串,因此我不再感到意外了 ;)

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

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

Write-Host $op相当于

Write-Host $op.ToString()

Get-LocalUser | Where-Object {$_.Name -eq "testuser1"} 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

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

$op = Get-LocalUSer | where-Object Name -eq "yourusername" | Measure
if ($op.Count -eq 0) {
     # DO SOMETHING
} else {
     # REPORT SOMETHING
}
$UserID = Get-LocalUser -Name 'UserName' -ErrorAction SilentlyContinue
if($UserID){
   Write-Host 'User Found'
}else{
    Write-Host 'User Not Found'
} #end if user exists

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM