Adresse e-mail de requête de répertoire actif de la ligne de commande pour le nom d'utilisateur

18

Sur Windows XP dans un environnement Active Directory - quel est le moyen le plus simple pour moi d'interroger l'adresse e-mail d'un utilisateur à partir d'AD en fonction de son nom d'utilisateur sur la ligne de commande.

(En supposant que je sais où il est conservé normalement dans l'arbre).

(Je sais sur l' utilisateur net loginname / domaine mais je veux juste l'élément adresse e - mail de retour.)

Oeil de faucon
la source
3
Veuillez noter que si vous êtes dans un échange complexe, l'attribut "mail" peut ne pas être l'adresse e-mail que vous recherchez. Vous devrez également consulter l'attribut à plusieurs valeurs "proxyAddresses" sur l'objet utilisateur.
Ryan Fisher

Réponses:

17
dsquery user -name "user name"|dsget user -samid -email -display 
pQd
la source
Ça
m'a tellement
1
Ok - peut-être que je n'étais pas clair - mais vous êtes assez proche - ce que je suppose que je voulais était: dsquery user -samid "loginname" | dsget user -email
Hawkeye
6

dsquery user -name "Prénom Nom" | dsget user -email

Le nettoyeur
la source
5

quelque chose comme ce dsquery pourrait fonctionner.

requête email par nom d'utilisateur dsquery.exe * -filter "(& (objectClass = user) (! (objectClass = computer) (sAMAccountName = username)))" | dsget user -email

J'ai mal lu le message en premier et j'ai pensé que vous vouliez un nom d'utilisateur à partir du nom de l'e-mail. C'est pourquoi j'ai posté celui-ci. dsquery.exe * -filter "(& (objectClass = user) (! (objectClass = computer) ([email protected])))" -attr username

basé sur quelques scripts au travail et ce site qui a d'autres idées http://www.petri.co.il/forums/showthread.php?t=18464 sur l'utilisation de csvde.exe

BrianP
la source
4

adfind -sc u: mail "nom d'utilisateur"

benPearce
la source
C'est un outil vraiment utile, même s'il serait plus génial si la personne fournissait le code source.
Justin Dearing
4

Si l'e-mail que vous souhaitez est également le nom d'utilisateur principal, vous pouvez l'obtenir avec

whoami /upn

Cependant, cela ne fonctionne que pour obtenir l'e-mail de l'utilisateur actuel, pas n'importe quel utilisateur comme la question initialement posée.

krispy
la source
A utilisé cette méthode en exécutant cmd en tant qu'utilisateur cible. A fonctionné comme un charme
Daniel
1
Cela ne renvoie également que l'UPN, qui n'est pas nécessairement la même que l'adresse e-mail publique par défaut de l'utilisateur, surtout si le domaine AD est .local ou quelque chose de similaire plutôt qu'un domaine public enregistré.
Craig
1
@Craig La première phrase de ma réponse dit que ...
krispy
2

Installez Powershell et le module complémentaire QuestAD. Ensuite, c'est quelque chose comme:

connect-qadservice
(get-qaduser 'bobsusername').emailAddress
Neobyte
la source
2

Vous pouvez écrire un VBScript simple pour interroger via LDAP Créer un fichier avec l'extension VBS

Mettez quelque chose comme ça

On Error Resume Next
Set objUser = GetObject _
  ("LDAP://CN=USER NAME,DC=DOMAIN_NAME,DC=com")

objUser.GetInfo

strMail = objUser.Get("mail")

WScript.echo "mail: " & strMail 

Mettez le NOM D'UTILISATEUR correct dans la chaîne de requête LDAP, exécutez le fichier VBS et profitez :)

Si c'est la première fois que vous travaillez avec LDAP, il pourrait être un peu compliqué d'écrire une requête LDAP Afin de reconnaître le chemin LDAP vers l'utilisateur (c'est-à-dire ce que vous devez mettre après LDAP: //), vous pouvez télécharger Active Directory Explorer à partir de Microsoft Run Explorer, accédez à l'utilisateur et voyez ce qu'il affiche dans la zone de texte Chemin

Dans mon cas, c'était quelque chose comme CN = [nom d'utilisateur], CN = Users, DC = [city_name], DC = [company_name], DC = com,

Bogdan_Ch
la source
2

LINQ à tout ! Pour plus de commodité:

1) Dans les propriétés de requête de LinqPad, ajoutez une référence à System.DirectoryServices.AccountManagement.dll. 2) Importation d'espace de noms supplémentaire: System.DirectoryServices.AccountManagement

using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MyDomain))
  using(UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "MyUserID"))
        usr.Dump();
Ce qui serait cool
la source
2

J'ai trouvé ce fil qui m'a aidé à obtenir ce que je voulais. Pour obtenir des attributs d'utilisateurs AD dans des variables d'environnement. Ce script prend tous les attributs souhaités de l'utilisateur connecté et définit une variable d'environnement correspondante. J'ai préfixé les variables mais c'est facultatif, donc le nom de variable devient "AD [nom d'attribut]". Les attributs sont de votre choix, il suffit d'ajouter ou de supprimer votre attribut après -attr. Pas très utile pour les attributs à valeurs multiples. La dernière (une) valeur va dans la variable d'environnement.

Ce script est local à cmd.exe actuel

for /F "tokens=1,* delims=: " %%A in ('dsquery * domainroot -l -filter "(&(objectCategory=Person)(objectClass=User)(sAMAccountName=%USERNAME%))" -attr adminDescription employeetype company department physicalDeliveryOfficeName street title mail') do set AD%%A=%%B

Pour obtenir des variables d'environnement globales dans Windows, nous pouvons utiliser "setx" dans Windows 7. (Pour loginscript peut-être ... mais beaucoup plus lentement.)

for /F "tokens=1,* delims=: " %%A in ('dsquery * domainroot -l -filter "(&(objectCategory=Person)(objectClass=User)(sAMAccountName=%USERNAME%))" -attr adminDescription employeetype company department physicalDeliveryOfficeName street title mail') do set AD%%A=%%B& setx AD%%A "%%~B" > NUL

: EDIT: un caractère espace à la fin de l'instruction set dans l'exemple 2 a provoqué la fin de la valeur avec un espace vide. Supprimé pour corriger. (Définir %% A = %% B & setx ...) A également découvert que vous devez exporter au moins deux attributs pour que le script fonctionne correctement.

Une réponse tardive, mais si cela peut aider quelqu'un, je suis heureux.

Jörgen en Suède
la source
1

Je ne sais pas si cela correspond à la moyenne du démarreur de fil ou non. Mais je viens de trouver une solution à mon problème existant qui a déjà été résolu après avoir parcouru ce fil. Recherche de l'ID DE CONNEXION DE L'UTILISATEUR en fonction de l'adresse de messagerie connue . :)

C:\Users\MrCMD>for /f "delims=" %u in ('type salesforce-uid-mail-address.txt') do @dsquery.exe * -filter "(&(objectClass=user)(!(objectClass=computer)(mail=%u)))">>"salesforce-uid-cn.txt"
┌─────────────────────────────────────┐
│ Executed Wed 07/10/2013  8:29:55.05 │ As [MrCMD]
└─────────────────────────────────────┘
C:\Users\MrCMD>for /f "delims=" %u in ('type salesforce-uid-cn.txt') do @dsget.exe user %u -samid -l|find "samid" /i>>"salesforce-uid-samid.txt"
┌─────────────────────────────────────┐
│ Executed Wed 07/10/2013  8:31:56.40 │ As [MrCMD]
└─────────────────────────────────────┘

Le fichier [ salesforce-uid-mail-address.txt ] contient la liste des adresses e-mail. Le fichier [ salesforce-uid-cn.txt ] contient "CN complet avec chemin". Et le fichier [ salesforce-uid-samid.txt ] contient "alias SAMID" "nom de connexion utilisateur". C'est tout le monde. Toutes les idées d'amélioration sont les bienvenues. :)

Rhak Kahr
la source
-1

Ci-dessous se trouve un script batch que j'ai écrit pour autre chose mais il peut être utilisé pour trouver l'attribut e-mail dans un CN sans trop de problème.


:: CN Attribute Lookup Tool
::   Written by Turbo Dog
::
:: -- Purpose: A simple lookup batch script using the ldifde command.
::
:: -- It was written to translate a hashed CN with it's more human readable attribute.
::
:: -- Multi environment version
::
:: -- anything in <brackets> is something you need to fill e.g. "set servip=10.0.0.5"
::
:: -- Generic ID Version:
:: -- <ID with read access to CN and it's target attribute> will have to be made, 
:: -- careful with this as it'll need to be a generic account with a non-expiring password
:: 
::
:BEGIN
@echo off
:: - Grey background with black font -
color 70
:RESTART
cls
:: Environment choice
:: default choice (1 preproduction 2 test 3 production)
set ENVCH=3
setlocal enableextensions enabledelayedexpansion
echo  ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
echo  Û CN Attribute Lookup Tool V1.0 Û
echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
echo. 
echo.
echo  1. PreProduction
echo  2. Test
echo  3. Production
echo.
echo  Please enter the number of the environment you wish to search and press enter or type q and press enter to quit: (3)
set /p ENVCH=
IF %ENVCH%==1 GOTO PPRODU
IF %ENVCH%==2 GOTO TESTEN
IF %ENVCH%==3 GOTO PRODUC
IF %ENVCH%==q GOTO FINISH
IF %ENVCH%==Q GOTO FINISH
IF %ENVCH%==[%1]==[] GOTO FINISH
:: PreProduction settings
:PPRODU
set envtype=PreProduction
set servip=<IP or hostname of preproduction AD server>
set servpt=<port number of preproduction AD server>
GOTO GATHER
:: Test settings
:TESTEN
set envtype=Test
set servip=<IP or hostname of test AD server>
set servpt=<port number of test AD server>
GOTO GATHER
:: Production settings
:PRODUC
set envtype=Production
set servip=<IP or hostname of production AD server>
set servpt=<port number of production AD server>
GOTO GATHER
:GATHER
:: - Gather information for job -
cls
:: - Grey background with black font -
color 70
echo  ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
echo  Û CN Attribute Lookup Tool V1.0 Û
echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
echo  Environment - !envtype!
echo. 
echo  Copy and paste the CN and press enter (or type q and enter to quit):
set /p resource=""
IF "%resource%"=="q" GOTO FINISH
IF "%resource%"=="Q" GOTO FINISH
set resourcein=!resource!
cls
:: - Process action -
ldifde -s %servip% -t %servpt% -a <ID with read access to CN and it's target attribute> <password for ID> -d "<the container that holds the CN's to search through cn=Container,ou=DOMAIN,o=ORG>" -f output.txt -l "<target attribute to read>" -r "(cn=%resource%)"
:: pause :: only have this line active (start colons missing) during troubleshooting to see if anything is written to the output.txt file
cls
:: - Extraction of the attribute from the output file -
set resource=
for /f "delims=" %%a in (output.txt) do (
    set line=%%a
    if "x!line:~0,22!"=="<target attribute to read>: " (
        set resource="!line:~22!"
    )
)
:: - Check to see if it has worked? -
IF NOT %resource%==[%1]==[] GOTO RESULT :: Resource value has something then send to the result step otherwise default to error
:: - The error message -
:: - Black background with red font (amiga guru looking error) -
color 0C
cls
echo  ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
echo  Û CN Attribute Lookup Tool V1.0 Û
echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
echo  Environment - !envtype!
echo.
echo  Sorry, it appears you've entered an CN that's either not for
echo  !envtype!, has not got anything in it's attribute or has been copied incorrectly!
echo.
echo  Press any key to retry.
:: - Cleanup errored output file -
del output.txt
pause >nul
GOTO GATHER
:: - The result -
:RESULT
:: - Copy result to clipboard -
echo|set/p=%resource%|clip
:: - Grey background with black font -
color 70
cls
echo  ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
echo  Û CN Attribute Lookup Tool V1.0 Û
echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
echo  Environment - !envtype!
echo. 
echo. Your submission was: "!resourcein!"
echo  The attribute is: !resource! 
echo.
echo  !resource! has been copied to the clipboard and is ready to paste.
echo.
:: - Cleanup output file -
del output.txt
:: - default to exit -
set fn=n
echo  Do you have additional resources to look up (y for yes, n for no and c to change environment)? (n):
set /p fn=""
IF %fn%==y GOTO GATHER
IF %fn%==Y GOTO GATHER
IF %fn%==c GOTO RESTART
IF %fn%==C GOTO RESTART
:FINISH
echo.
echo  Thank you, press any key to exit.
pause >nul
:: - Set CMD Shell colours back to default -
color 07
:: - The end - 
@echo off
:EOF

Turbo Dog
la source
Il y a beaucoup de travail là-bas et le script est probablement utile dans l'environnement pour lequel il a été écrit, mais je ne vois pas comment il répond mieux à la question que les autres réponses beaucoup plus courtes qui ne nécessitent pas d'entrée d'IP et qui ont été en place ici depuis des années (plus de sept dans le cas de celui accepté). Il y a beaucoup de questions plus récentes et sans réponse qui apprécieront une visite de votre part!
Loi29