【问题标题】:In Powershell get UPN from PC name在 Powershell 中从 PC 名称获取 UPN
【发布时间】:2021-11-04 07:44:30
【问题描述】:

我的脚本被困了几天:

我收到一个 CSV 列表,其中包含一些在 Azure 中的 intune 和 AAD 中的 PC 名称。从该列表中,我想知道哪台 PC 拥有哪些所有者。

Connect-AzureAD
$csv = Import-Csv C:\Tools\chatelet.csv
$ObjectID=@()
foreach ($DisplayName in $csv){
    $DisplayName
    $ObjectID1 = get-AzureADDevice -Filter "DisplayName eq $DisplayName" | Select ObjectID | ft -HideTableHeaders
    $ObjectID1
    $objectID += $ObjectID1
}
$ObjectID
$ObjectID | Out-File -encoding UTF8 'C:\Tools\BulkObjectID.csv'

$csv2 = Import-Csv C:\Tools\BulkObjectID.csv
$Owners=@()
foreach ($UPN in $csv2){
    $DisplayName
    $Owners1 = Get-AzureADDeviceRegisteredOwner -ObjectId $UPN |select mail
    $Owners1
    $Owners += $Owners1
}
$Owners | Out-File -encoding UTF8 'C:\Tools\Owners.csv'

我收到了那个错误:

get-AzureADDevice : Error occurred while executing GetDevices 
Code: Request_BadRequest
Message: Syntax error: character '{' is not valid at position 16 in 'DisplayName eq @{DisplayName=SUS-5CG1027Z61}'.
RequestId: d102bfb2-b991-4fd7-afc7-a78de251662c
DateTimeStamp: Thu, 04 Nov 2021 07:42:04 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed
Au caractère Ligne:5 : 18
+ ... ObjectID1 = get-AzureADDevice -Filter "DisplayName eq $DisplayName" | ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-AzureADDevice], ApiException
    + FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.GetDevice

【问题讨论】:

  • 似乎在您的变量$DisplayName 中不仅仅是显示名称的值。正如错误消息所述,它包含@{DisplayName=SUS-5CG1027Z61}。所以调整你的代码,变量只包含名称

标签: powershell endpoint script intune


【解决方案1】:

使用Import-Csv 导入 CSV 文件时,即使 csv 文件只有一列,结果也是一个对象数组。

这意味着你需要重写这个:

$ObjectID=@()
foreach ($DisplayName in $csv){
    $DisplayName
    $ObjectID1 = get-AzureADDevice -Filter "DisplayName eq $DisplayName" | Select ObjectID | ft -HideTableHeaders
    $ObjectID1
    $objectID += $ObjectID1
}

进入:

$ObjectID = foreach ($item in $csv){
    Write-Host $item.DisplayName
    # just output the result, it will be collected in variable $ObjectID
    Get-AzureADDevice -Filter "DisplayName eq '$($item.DisplayName)'" | Select-Object ObjectID
}

你可能已经注意到了,我有

  • 将迭代变量的变量名从$DisplayName更改为$item,表示每个项目都有一个名为DisplayName属性
  • 在过滤器字符串$($item.DisplayName)中使用了子表达式
  • 删除了 ft -HideTableHeaders,因为 Format-Table 仅用于显示目的,如果您需要进一步处理结果,则不应使用
  • 删除了与 += 的数组连接,因为这会耗费时间和内存(每次迭代时,必须在内存中重新创建 完整 数组)并且只需 捕获 变量$ObjectID 中foreach 循环的结果

这同样适用于代码的第二部分。 将其替换为:

$Owners = foreach ($item in $csv2){
    # just output the result, it will be collected in variable $Owners
    Get-AzureADDeviceRegisteredOwner -ObjectId $item.ObjectID | Select-Object mail
}

在这里,由于您正在从较早的循环中重新加载 csv(实际上这不是必需的,因为您在内存中的变量 $ObjectID 中仍有该信息),您需要使用正确的标头,因此 ObjectID 而不是UPN.

最后,请不要使用Out-File 创建 CSV 文件。使用

$ObjectID | Export-Csv -Path 'C:\Tools\BulkObjectID.csv' -Encoding UTF8 -NoTypeInformation

$Owners | Export-Csv -Path 'C:\Tools\Owners.csv' -Encoding UTF8 -NoTypeInformation

改为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2022-10-17
    相关资源
    最近更新 更多