我想创建一个包含所有 Azure AD 应用程序的输出,它返回 a) 所有列表 b) 即将到期的应用程序列表 编辑

问题描述

这是我目前所拥有的,但 $expirationlist 不会返回所有使用 $expirationlist 变量到期的应用程序的列表。

$date= get-date
$expirationdate= $date.AddDays(30)
$ADApplications = Get-AzADApplication 
$result = foreach ($application in $ADApplications)
{
$credentials = Get-AzADAppCredential -ApplicationId 
$application.ApplicationId 
$startDate = $credentials.StartDate
$EndDate = $credentials.EndDate



[PSCustomObject]@{
    ApplicationName = $application.displayName
    ApplicationID = $application.ApplicationId
    ObjectID = $application.ObjectId
    CreationDate = $startDate
    ExpirationDate = $EndDate
   

}
if($EndDate -lt $expirationdate)
   {
        $expirationlist = [PSCustomObject]@{
       ApplicationName = $application.displayName
       ApplicationID = $application.ApplicationId
        ObjectID = $application.ObjectId
        CreationDate = $startDate
        ExpirationDate = $EndDate  
        }
    }
}
$expirationlist

解决方法

错误来自于使用 PSCustomObject 键转换 $null

示例:

PS /> [pscustomobject]@{ $null = 'asd' }
A null key is not allowed in a hash literal.
At line:1 char:19
+ [pscustomobject]@{ $null = 'asd' }
+                    ~~~~~
    + CategoryInfo          : InvalidOperation: (System.Collecti...deredDictionary:OrderedDictionary) [],RuntimeException
    + FullyQualifiedErrorId : InvalidNullKey

由于这些变量没有定义,它们基本上是空的:

$ApplicationName$ApplicationID$ObjectID

试试这个,它应该可以工作,我还添加了一个小的效率改进:

$ADApplications = Get-AzADApplication
$result = foreach ($application in $ADApplications)
{
    $credentials = Get-AzADAppCredential -ApplicationId $application.ApplicationId 
    $StartDate = $credentials.StartDate
    $EndDate = $credentials.EndDate
    
    [PSCustomObject]@{
        ApplicationName = $application.DisplayName
        ApplicationID = $application.ApplicationId
        ObjectID = $application.ObjectId
        CreationDate = $StartDate
        ExpirationDate = $EndDate
    }
}

$result 

编辑

$result | Where-Object {[datetime]$_.EndDate -lt [datetime]::Now.AddDays(30)}