powershell Microsoft Graph用户创建

46scxncf  于 11个月前  发布在  Shell
关注(0)|答案(1)|浏览(136)

我正在编写以前编写的脚本的新版本,但我正在升级它以使用MSCraph创建Office 365帐户。
我在这里遇到了一个问题,因为我创建了一个函数来测试用户是否存在:

#Function to check account existence
Function AccountExists
{
    Param(
            [string]$fxEmailAccount
          )
    
    #Validamos si la cuenta existe
    $return = [System.Convert]::ToBoolean("TRUE")
    try {
        $user = Get-MgUser -UserId $fxEmailAccount
        Write-Output $($user.Count())
    }
    catch {
            $return = [System.Convert]::ToBoolean("FALSE")
    }
    return $return
}

$result = AccountExists -fxEmailAccount [email protected]

字符串
这对我来说部分有效,这里的问题是我如何正确检查帐户的存在,因为Get-MGUser返回一个对象,每次我运行函数时,它有时会因为我实现的逻辑而失败。
我已经尝试过使用Get-MgUserCount,但在这种方法上也没有任何运气。
有人能告诉我,我可能做错了什么,或者没有很好地解释这样做。
谢谢你,

gupuwyp2

gupuwyp21#

您的函数可能可以简化为以下PowerShell惯用形式:

function Test-AccountExists {
  param(
    $UserId
  )
  [bool] (Get-MgUser -UserId $UserId -ErrorAction Ignore)
}

# Sample invocation
$result = Test-AccountExists -UserId [email protected]

字符串

  • 名称Test-AccountExists使用PowerShell的动词-名词命名约定approved verbTest
  • -ErrorAction Ignore忽略不存在的用户ID导致的错误,并使Get-MgUser不产生输出。
  • 使用PowerShell's to-Boolean coercion logic转换为[bool],如果返回用户对象,则会生成$true,如果没有输出,则会生成$false
  • 由于强制转换既没有被捕获到变量中,也没有被发送到不同的命令中,因此其结果是 * 隐式输出 *,即成为函数的“返回值”(下面将详细介绍)。
  • 正如Santiago所指出的,Get-MgUser-UserId参数接受的是UPN(用户主体名称)或URL,并且不是每个电子邮件地址都是UPN,因此最好也使用-UserId作为函数的参数名称。

至于你尝试了

  • PowerShell具有用于布尔值的内置常量(automatic variables):$true$false,因此不需要[System.Convert]::ToBoolean("...")
  • 我 * 假设 * 当具有给定身份的用户不存在时,Get-MgUser返回的错误是一个 * 非终止 * 错误:在PowerShell中,这样的错误不会被try / catch语句捕获-除非您使用-ErrorAction Stop将其提升为 * 终止 * 语句。然而,在手头的情况下,使用-ErrorAction Ignore来 * 忽略 * 错误更简单,并从输出的缺失中推断输出的存在,如上所示。
  • Write-Output $($user.Count())
  • 由于上述隐式输出行为:
  • 该语句可以简化为$user.Count()
  • 但是,看起来objects returned by Get-MgUser * 没有 * 实现.Count() * 方法 *,所以这个调用可能会失败-并触发catch块。
  • 相比之下,PowerShell中的任何对象都保证具有.Count * 属性 *:如果给定对象的类型没有该名称的本机属性,则PowerShell将其作为intrinsic member提供,报告标量(非集合)对象的1$null0
  • 更重要的是,如果语句 * 确实 * 写了一些东西,它也会成为函数的“返回值”(输出对象流)* 的一部分-而不仅仅是传递给return的内容。
  • 有关PowerShell的隐式输出行为和return关键字的作用的概念信息,请参见this answer

相关问题