scripts query comandos active powershell active-directory

comandos - powershell active directory query



Al pasar una cadena en el parámetro de filtro Get-ADUser se produce un error: la propiedad no se encuentra en pscustomobject (3)

El BNF para las cadenas de consulta de filtro no permite expresiones como el segundo operando en una comparación, solo valores (énfasis mío):

Sintaxis:
La siguiente sintaxis usa el formulario Backus-Naur para mostrar cómo usar el lenguaje de expresión de PowerShell para este parámetro.

<filter> :: = "{" <FilterComponentList> "}"
<FilterComponentList> :: = <FilterComponent> | <FilterComponent> <JoinOperator> <FilterComponent> | <NotOperator> <FilterComponent>
<FilterComponent> :: = <attr> <FilterOperator> <value> | "(" <FilterComponent> ")"
<FilterOperator> :: = "-eq" | "-le" | "-ge" | "-ne" | "-lt" | "-gt" | "-approx" | "-bor" | "-banda" | "-recursivematch" | "-como" | "-diferente a"
<JoinOperator> :: = "-y" | "-o"
<NotOperator> :: = "-not"
<attr> :: = <Nombre de la propiedad> | <LDAPDisplayName del atributo>
<value> :: = <compara este valor con un <attr> utilizando el <FilterOperator>> especificado

Ponga el valor de la propiedad con la que desea comparar en una variable y use esa variable en la comparación. También es posible que desee definir el filtro como una cadena real, aunque solo sea por claridad (a pesar de lo que parece que el filtro no es un bloque de script).

$upn = $newUser.UPN $exists = Get-ADUser -Filter "UserPrincipalName -eq ''$upn''" ...

Estoy tratando de crear un nuevo usuario de Active Directory, pero primero verifico que el usuario ya no existe con Get-ADUser . Importo los datos de usuario de nuestro departamento de recursos humanos y construyo propiedades personalizadas:

$newUsers = Import-Csv $csvFile | Select-Object -Property @{n=''EmpNum'';e={$_.''Employee Number''}}, @{n=''UPN'';e={$_.''Email Address''}}, @{n=''Alias'';e={$_.''Email Address''.Split("@")[0]}} #### etc

Cuando recorro los objetos del archivo CSV, uso la propiedad UPN para buscar al usuario en Active Directory:

foreach ($newUser in $newUsers) { $exists = Get-ADUser -Filter {UserPrincipalName -eq $newUser.UPN} -Properties * -Server $adServer -Credential $adCred ... }

El filtro causa un error:

Get-ADUser : Property: ''UPN'' not found in object of type: ''System.Management.Automation.PSCustomObject''. At C:/Users/bphillips.NEWHOPEOFIN/Dropbox/Powershell/NewHire/AddNewDSP.ps1:50 char:15 + $exists = Get-ADUser -Filter {UserPrincipalName -eq $newUser.UPN} -Propertie ...

He intentado hacer esto: -Filter {UserPrincipalName -eq $ ("$ newUser.UPN") pero eso no ayuda; Me sale otro error

Get-ADUser : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again. At C:/Users/bphillips.NEWHOPEOFIN/Dropbox/Powershell/NewHire/AddNewDSP.ps1:50 char:15 + $exists = Get-ADUser -Filter {UserPrincipalName -eq $("$newUser.UPN")} -Prop ...

$newUser es una cadena, por lo que no entiendo por qué causa un problema. Codificar un nombre de usuario principal como "[email protected]" funciona, pero $newUser.UPN no funcionará. **

PS C:/> $newUser.UPN.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object

y

PS C:/> $newUser.UPN | gm TypeName: System.String

$newUser.UPN contiene un valor de cadena válido

PS C:/> $newUser.UPN [email protected]

¿Qué debo hacer para que $newUser.UPN sea ​​reconocido como una cadena para el parámetro de filtro? ¿Qué está pasando que no entiendo?


Las expresiones pueden estar dentro del bloque de filtro de un Get-ADUser pero deben estar correctamente envueltas con comillas.

Get-ADUser -Filter "UserPrincipalName -eq ''$($newUser.UPN)''"


  • Nunca use un bloque de script ( { ... } ) como argumento -Filter - el tipo del parámetro -Filter es [string] - construya su filtro como una cadena .

    • La respuesta de BenH muestra cómo hacer eso.
  • Si bien parece conveniente, el uso de un bloque de script solo funciona en escenarios muy limitados y causa confusión cuando no funciona , como cuando se trata de acceso a la propiedad , como en este caso.

Para obtener más información, vea esta respuesta mía.