Powershell: lastLogonTimestamp em branco para alguns usuários

5

Estou desenvolvendo um script para relatar usuários que não fizeram login no domínio por seis meses. Eu estou usando lastLogonTimestamp como dentro de 14 dias é preciso o suficiente para meus propósitos, e eu não quero ter que consultar cada DC.

O problema é que, quando executo o script, o lastLogonTimestamp fica em branco para quase 600 usuários. Mas, e aqui está o estranho, eu posso fazer Get-ADUser (que é o que é usado dentro do script para recuperar esta informação) para um desses usuários no mesmo prompt e isso me dá um valor.

O que poderia estar causando isso?

ATUALIZAÇÃO: Apenas para esclarecer. Sim, o DFL é de 2003. Além disso, para esclarecer. Estou me referindo apenas ao atributo lastLogonTimestamp, não a qualquer outro atributo.

O script começa criando um objeto contendo todos os usuários:

$userlist = Get-ADUser -Filter * -properties lastLogonTimestamp

Além de alguma outra lógica, escrevo cada usuário em um arquivo de texto usando um foreach ($user in $userlist) loop. Efetivamente

$name = $user.Name
$llts = $user.lastLogonTimestamp

Quando reviso o arquivo de texto, o lastLogonTimestamp fica em branco para quase 600 usuários. De algumas delas, eu escolho um assunto de teste, por exemplo, alguém que eu conheço fez logon recentemente, digamos user-x. User-x terá lastLogonTimestamp em branco no arquivo de texto. Se, no entanto, eu então correr

Get-ADUser user-x -properties lastLogonTimestamp

na mesma linha de comando após o script ser concluído para user-x, ele retorna um valor para lastLogonTimestamp.

UPDATE 2: Isso não faz sentido! Alterei o script para extrair a propriedade lastLogonTimestamp no loop, em vez de criar o objeto userlist:

foreach ($user in $userlist)
{
$SamAccountName = $user.SamAccountName
$thisUser = Get-ADUser $SamAccountName -properties lastLogonTimeStamp

...
}

Eu pensei que isso iria replicar mais de perto o que eu estou usando na linha de comando quando ele puxa a propriedade com sucesso, mas ainda não funciona. Provavelmente vale a pena apontar que são sempre os mesmos usuários.

    
por Matt 08.03.2012 / 00:26

3 respostas

4

O problema é com esta afirmação na sua atualização 2

$SamAccountName = $user.SamAccountName

é que, depois de fazer isso, o tipo de objeto $ SamAccountName é System.String, portanto, você perdeu o contexto de usuário do AD.
Tente isto:

get-aduser -filter * -properties lastLogonTimestamp | select name, lastLogonTimestamp |export-csv "output.csv"

Para o seu código anterior, o problema parece ser com outro tratamento de variáveis. Um snippet mais substancial nos ajudará a dar uma resposta melhor

    
por 08.03.2012 / 00:37
1

Você está percorrendo todos os seus controladores de domínio para obter a verdadeira hora do último logon? Esta propriedade e valor não são sincronizados entre os DCs IIRC. Esta é a função que usamos em nosso ambiente para recuperar o valor correto para um único usuário:

function func_ad.getLastLogon
{
param(
[string]$username
)

$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{ 
    $hostname = $dc.HostName
    $userResult = Get-ADUser -Identity $username -properties lastLogon -Server $hostname
    if($userResult.LastLogon -gt $time) 
    {
        $time = $userResult.LastLogon
    }
}
$dt = [DateTime]::FromFileTime($time)
return $dt
}

No seu caso, para evitar duplicação desnecessária eu colocaria Get-ADDomainController fora da função, mas passaria a matriz de DCs para a função junto com o nome de usuário. Você pode até mesmo modificar o parâmetro $ username para aceitar uma matriz ...

    
por 16.03.2012 / 20:14
0

Eu encontrei esse mesmo problema e o que eu achei que ajudou foi executá-lo como administrador. isso não faz sentido, já que as informações devem estar disponíveis para qualquer usuário autenticado, mas aí está.

    
por 21.05.2015 / 22:58