在PowerShell中从PC名称获取UPN

wn9m85ua  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(201)

从我的剧本开始,我就被困住了:
我收到一个CSV列表,其中包含Intune和Azure中的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
zour9fqk

zour9fqk1#

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

取而代之的是。

相关问题