在PowerShell中从PC名称获取UPN

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

从我的剧本开始,我就被困住了:
我收到一个CSV列表,其中包含Intune和Azure中的AAD中的一些PC名称。从这个列表中,我想知道哪台PC有哪些所有者。

  1. Connect-AzureAD
  2. $csv = Import-Csv C:\Tools\chatelet.csv
  3. $ObjectID=@()
  4. foreach ($DisplayName in $csv){
  5. $DisplayName
  6. $ObjectID1 = get-AzureADDevice -Filter "DisplayName eq $DisplayName" | Select ObjectID | ft -HideTableHeaders
  7. $ObjectID1
  8. $objectID += $ObjectID1
  9. }
  10. $ObjectID
  11. $ObjectID | Out-File -encoding UTF8 'C:\Tools\BulkObjectID.csv'
  12. $csv2 = Import-Csv C:\Tools\BulkObjectID.csv
  13. $Owners=@()
  14. foreach ($UPN in $csv2){
  15. $DisplayName
  16. $Owners1 = Get-AzureADDeviceRegisteredOwner -ObjectId $UPN |select mail
  17. $Owners1
  18. $Owners += $Owners1
  19. }
  20. $Owners | Out-File -encoding UTF8 'C:\Tools\Owners.csv'

我收到了这个错误:

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

zour9fqk1#

使用Import-Csv导入CSV文件时,即使CSV文件只有一列,结果也是一个由对象组成的数组。
这意味着您需要重写以下代码:

  1. $ObjectID=@()
  2. foreach ($DisplayName in $csv){
  3. $DisplayName
  4. $ObjectID1 = get-AzureADDevice -Filter "DisplayName eq $DisplayName" | Select ObjectID | ft -HideTableHeaders
  5. $ObjectID1
  6. $objectID += $ObjectID1
  7. }

进入:

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

正如你可能已经注意到的,我已经

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

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

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

在这里,由于您是从前面的循环重新加载CSV(实际上这并不是必需的,因为您在内存中的变量$ObjectID中仍有该信息),因此您需要使用正确的头文件,因此ObjectID而不是UPN
最后,不要使用Out-File创建CSV文件。使用

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

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

取而代之的是。

展开查看全部

相关问题