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

zzzyeukh  于 2023-04-30  发布在  Shell
关注(0)|答案(4)|浏览(424)

这个问题有两个部分。
1.我想在创建本地用户之前检查它是否存在。到目前为止,我已经想出了一个简单的脚本来检查本地用户是否存在。下面是在创建用户之前检查用户是否存在的脚本。

$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
 }

我在我的设置上测试了这个,它在大多数情况下工作得很好,没有引发任何异常。有没有更好、更快的方法来检查用户是否存在?还有,我用的脚本是万无一失的i例如,使用 ErrorAction 或 *try来处理它会更好。...抓住 *?
我将使用这个脚本检查多个用户帐户,然后再创建它们。
1.为什么$op在以下情况下不同?

案例一

案例二

我知道 Out-String 是导致这种输出差异的原因,但我希望在用例1中输出不仅仅是 * testuser 1 *。
我是PowerShell的新手,所以有人能帮助我理解为什么输出会有差异吗?

q9rjltbz

q9rjltbz1#

使用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
pgky5nke

pgky5nke2#

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

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

8wtpewkr3#

第一行调用Get-LocalUser commandlet并使用Name参数指定要搜索的用户。如果找到该用户,则将分配变量$UserID。如果Get-LocalUser无法找到用户,则会出错,并且不会进行任何分配。指定ErrorAction“SilentlyContinue”将告诉PowerShell不要停止或警告如果赋值出错。
If($UserID)测试将在变量赋值成功时返回True,否则返回False。

$UserID = Get-LocalUser -Name 'UserName' -ErrorAction SilentlyContinue
if($UserID){
   Write-Host 'User Found'
}else{
    Write-Host 'User Not Found'
} #end if user exists
ujv3wf0j

ujv3wf0j4#

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

相关问题