Question [Fonction] Recherche objets Active Directory

Plus d'informations
il y a 10 ans 5 mois #16085 par Matthew BETTON
Bonsoir,

Je te remercie Laurent pour ta bienveillance :)

Laurent Dardenne écrit:

Après relecture, m'est avis que ceci :
[code:1]$objList += $objCustom[/code:1]
Peut-être optimisé.
Mais je ne sais pas quel comportement tu voulais offrir en renvoyant tjr une collection, qui peut être vide.
D'émettre l'objet directement dans le pipe reste possible.


Ok, j'ai modifié le code en conséquence.

De typer l'objet personnalisé ne serait pas de trop.


Fait ;)

Et pour ceci :
[code:1]
Write-Error \"Une erreur s'est produite lors de la création d'un ou plusieurs objets personnalisés ...\"
$objList = $null

[/code:1]
Le fait de stopper le script est peut être à revoir, car si j'ai plusieurs objets en erreur pour des causes différentes, je dois relancer le script autant de fois qu'il y a d'erreur.

Une autre approches serait d'implémenter le paramètre -Strict .


J'ai modifié le code selon la première approche. Pour la seconde, je la garde pour le moment à l'esprit ;)

Enfin pour $LDAPpath je le placerais en Mandatory, car par défaut l'appel échouera.
Il est possible de configurer ce paramètre, mais cela dépend de l'usage de chacun ( global, module ou script).


Je le laisse en 'non obligatoire' mais j'ai modifié le code pour que ce paramètre prenne la chaîne LDAP du domaine courant par défaut, ce qui est plus dynamique ...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 5 mois #16086 par Matthew BETTON
Concernant le typage de l'objet personnalisé, en fait je ne sais pas quel nom serait le plus pertinent.

Logiquement, la requête LDAP renvoie des objets de type 'System.DirectoryServices.SearchResult'.

Les objets de type 'Microsoft.ActiveDirectory.Management.ADUser', 'Microsoft.ActiveDirectory.Management.ADGroup' ou 'Microsoft.ActiveDirectory.Management.ADComputer' sont renvoyés par exemple par les Cmdlets du module ActiveDirectory ...

Bref, j'ai donc pour le moment déclaré un type \&quot;Microsoft.ActiveDirectory.Management.AD$Class.PSCustomObject\&quot; qui change en fonction de la classe recherchée.<br><br>Message édité par: Matthew BETTON, à: 3/10/13 20:21

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 5 mois #16089 par Laurent Dardenne
Matthew BETTON écrit:

Concernant le typage de l'objet personnalisé, en fait je ne sais pas quel nom serait le plus pertinent.

C'est en nommant que l'on devient nommeur :lol:
Ce n'est pas tjr évident de nommer des PSobjects.
Matthew BETTON écrit:

sont renvoyés par exemple par les Cmdlets du module ActiveDirectory ...

Il se peut que ces classse soient associées au provider AD, mais je n'ai jamais désassemblé le code ...
Matthew BETTON écrit:

Bref, j'ai donc pour le moment déclaré un type \&quot;Microsoft.ActiveDirectory.Management.AD$Class.PSCustomObject\&quot; qui change en fonction de la classe recherchée.

AD$Class me semble suffisant, car d'utiliser le nom de l'espace de nom 'Microsoft.ActiveDirectory.Management' ne correspond pas à la réalité et peut porter à confusion, quand à 'PSCustomObject' il est déjà dans la liste TypeNames.

Du coup on peut regrouper les objets ainsi :
[code:1]
$Class='User'
$o=new-object psobject -property @{ name=\&quot;nom\&quot;}
$o.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$o.psobject.TypeNames


$o2=new-object psobject -property @{ name=\&quot;nom2\&quot;}
$o2.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$Class='Group'
$o3=new-object psobject -property @{ name=\&quot;nom3\&quot;}
$o3.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)

$o,$o2,$o3|group @{Expression={$_.PSObject.TypeNames[0]}}
[/code:1]
A vérifier si on peut combiner + critéres, ex l'OU.

Une dernière chose, l'attribut [OutputType] peut s'appuyer sur ce nommage il me semble, ici aussi c'est à vérifier.<br><br>Message édité par: Laurent Dardenne, à: 3/10/13 21:32

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 5 mois #16095 par Matthew BETTON
Bonsoir Laurent,

J'ai fait quelques modifications sur le code.

Au sujet de OutputType :

[code:1]
PS &gt; (Get-Command Get-ADSIobjects).outputtype

Name Type
---- ----
ADUser
ADComputer
ADGroup
ADorganizationalUnit
[/code:1]

A vérifier si on peut combiner + critéres, ex l'OU.


J'ai ajouté le cas de l'OU : 'organizationalUnit'.

Au passage, on peut récupérer toutes les classes du schéma Active Directory de cette façon :

[code:1]
PS &gt; $schema =[DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
PS &gt; $classes = $schema.FindAllClasses()
PS &gt; $classes | Select-Object -ExpandProperty Name
organization
nTDSDSA
dMD
subSchema
attributeSchema
account
classSchema
aCSPolicy
aCSResourceLimits
aCSSubnet
addressBookContainer
addressTemplate
applicationEntity
applicationProcess
applicationSettings
applicationSiteSettings
applicationVersion
builtinDomain
categoryRegistration
certificationAuthority
classRegistration
classStore
comConnectionPoint
computer
configuration
connectionPoint
contact
person
container
controlAccessRight
country
cRLDistributionPoint
crossRef
crossRefContainer
device
dfsConfiguration
dHCPClass
displaySpecifier
displayTemplate
dnsNode
dnsZone
document
documentSeries
domain
domainDNS
domainPolicy
domainRelatedObject
dSUISettings
dSA
dynamicObject
fileLinkTracking
fileLinkTrackingEntry
foreignSecurityPrincipal
friendlyCountry
fTDfs
group
groupOfNames
groupOfUniqueNames
groupPolicyContainer
indexServerCatalog
inetOrgPerson
infrastructureUpdate
intellimirrorGroup
intellimirrorSCP
interSiteTransport
interSiteTransportContainer
ipsecBase
ipsecFilter
ipsecISAKMPPolicy
ipsecNegotiationPolicy
ipsecNFA
ipsecPolicy
leaf
licensingSiteSettings
linkTrackObjectMoveTable
linkTrackOMTEntry
linkTrackVolEntry
linkTrackVolumeTable
locality
lostAndFound
mailRecipient
meeting
msCOM-Partition
msCOM-PartitionSet
msDS-App-Configuration
msDS-AppData
msDS-AzAdminManager
msDS-AzApplication
msDS-AzOperation
msDS-AzRole
msDS-AzScope
msDS-AzTask
msDS-OptionalFeature
msDS-PasswordSettings
msDS-PasswordSettingsContainer
msDS-QuotaContainer
msDS-QuotaControl
msDS-ManagedServiceAccount
msExchConfigurationContainer
msDFSR-LocalSettings
msDFSR-Subscriber
msDFSR-Subscription
msDFSR-GlobalSettings
msDFSR-ReplicationGroup
msDFSR-Content
msDFSR-ContentSet
msDFSR-Topology
msDFSR-Member
msDFSR-Connection
msieee80211-Policy
msImaging-PSPs
msImaging-PostScanProcess
msPrint-ConnectionPolicy
msPKI-Enterprise-Oid
msPKI-Key-Recovery-Agent
mS-SQL-SQLServer
mS-SQL-OLAPServer
mS-SQL-SQLRepository
mS-SQL-SQLPublication
mS-SQL-SQLDatabase
mS-SQL-OLAPDatabase
mS-SQL-OLAPCube
msTAPI-RtConference
msTAPI-RtPerson
msWMI-IntRangeParam
msWMI-IntSetParam
msWMI-MergeablePolicyTemplate
msWMI-ObjectEncoding
msWMI-PolicyTemplate
msWMI-PolicyType
msWMI-RangeParam
msWMI-RealRangeParam
msWMI-Rule
msWMI-ShadowObject
msWMI-SimplePolicyTemplate
msWMI-Som
msWMI-StringSetParam
msWMI-UintRangeParam
msWMI-UintSetParam
msWMI-UnknownRangeParam
msWMI-WMIGPO
mSMQConfiguration
msMQ-Custom-Recipient
mSMQEnterpriseSettings
msMQ-Group
mSMQMigratedUser
mSMQQueue
mSMQSettings
mSMQSiteLink
nTDSConnection
nTDSDSARO
nTDSService
nTDSSiteSettings
nTFRSMember
nTFRSReplicaSet
nTFRSSettings
nTFRSSubscriber
nTFRSSubscriptions
organizationalPerson
organizationalRole
organizationalUnit
packageRegistration
physicalLocation
pKICertificateTemplate
pKIEnrollmentService
msPKI-PrivateKeyRecoveryAgent
printQueue
queryPolicy
remoteMailRecipient
remoteStorageServicePoint
residentialPerson
rFC822LocalPart
rIDManager
rIDSet
room
rpcContainer
rpcEntry
rpcGroup
rpcProfile
rpcProfileElement
rpcServer
rpcServerElement
rRASAdministrationConnectionPoint
rRASAdministrationDictionary
samDomain
samDomainBase
samServer
secret
securityObject
securityPrincipal
server
serversContainer
serviceAdministrationPoint
serviceClass
serviceConnectionPoint
serviceInstance
simpleSecurityObject
site
siteLink
siteLinkBridge
sitesContainer
storage
subnet
subnetContainer
top
trustedDomain
typeLibrary
user
volume
posixAccount
shadowAccount
posixGroup
ipService
ipProtocol
oncRpc
ipHost
ipNetwork
nisNetgroup
nisMap
nisObject
ieee802Device
bootableDevice
msSFU30MailAliases
msSFU30NetId
msSFU30DomainInfo
msSFU30NetworkUser
msSFU30NISMapConfig
ms-net-ieee-80211-GroupPolicy
ms-net-ieee-8023-GroupPolicy
msFVE-RecoveryInformation
msDFS-DeletedLinkv2
msDFS-Linkv2
msDFS-NamespaceAnchor
msDFS-Namespacev2
[/code:1]

Mais toutes ces classes ne sont pas 'intéressantes' à requêter. Certaines ne sont pas forcément utilisées, d'autres sont liées au fonctionnement interne de l'AD ...


[code:1]
PS C:\Users\Administrator&gt; $Classes | ?{$_.Name -eq 'computer'} | Select *


Name : computer
CommonName : Computer
Oid : 1.2.840.113556.1.3.30
Description :
IsDefunct : False
PossibleSuperiors : {container, organizationalUnit, domainDNS}
PossibleInferiors : {serviceInstance, applicationVersion, ms-net-ieee-80211-GroupPolicy, rpcProfile...}
MandatoryProperties : {cn, instanceType, nTSecurityDescriptor, objectCategory...}
OptionalProperties : {accountExpires, accountNameHistory, aCSPolicyName, adminCount...}
AuxiliaryClasses : {mailRecipient, posixGroup, ipHost, samDomain...}
SubClassOf : user
Type : Structural
SchemaGuid : bf967a86-0de6-11d0-a285-00aa003049e2
DefaultObjectSecurityDescriptor : System.DirectoryServices.ActiveDirectorySecurity
[/code:1]

Voir notamment les 'MandatoryProperties' et les 'OptionalProperties' de la Classe.<br><br>Message édité par: Matthew BETTON, à: 5/10/13 23:37

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 5 mois #16098 par Laurent Dardenne
Matthew BETTON écrit:

J'ai ajouté le cas de l'OU : 'organizationalUnit'.

Au temps pour moi, je pensais plus à des niveaux de regroupement qui tout comptes fait n'ont rien à voir avec le code mais avec son résultat :
[code:1]
$Class='User'
$o=new-object psobject -property @{ name=\&quot;nom\&quot;;OU='Compta'}
$o.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$o.psobject.TypeNames


$o2=new-object psobject -property @{ name=\&quot;nom2\&quot;;OU='Commercial'}
$o2.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$Class='Group'
$o3=new-object psobject -property @{ name=\&quot;nom3\&quot;;OU='Compta'}
$o3.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$o4=new-object psobject -property @{ name=\&quot;nom2\&quot;;OU='Commercial'}
$o4.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)

$Class='User'
$o5=new-object psobject -property @{ name=\&quot;nom\&quot;;OU='Compta'}
$o5.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)

$o6=new-object psobject -property @{ name=\&quot;nom2\&quot;;OU='Commercial'}
$o6.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$Class='Group'
$o7=new-object psobject -property @{ name=\&quot;nom3\&quot;;OU='Compta'}
$o7.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)
$o8=new-object psobject -property @{ name=\&quot;nom2\&quot;;OU='Commercial'}
$o8.PSObject.TypeNames.Insert(0,\&quot;AD$Class\&quot;«»)

$o,$o2,$o3,$o4,$o5,$o6,$o7,$o8|group @{Expression={$_.PSObject.TypeNames[0]}},OU
[/code:1]

Count Name Group


----
2 ADUser, Compta {@{name=nom; OU=Compta}, @{name=nom; OU=Compta}}
2 ADUser, Commercial {@{name=nom2; OU=Commercial}, @{name=nom2; OU=Commercial}}
2 ADGroup, Compta {@{name=nom3; OU=Compta}, @{name=nom3; OU=Compta}}
2 ADGroup, Commercial {@{name=nom2; OU=Commercial}, @{name=nom2; OU=Commercial}}

Je vais m'arrêter là :)

[edit]
[code:1]
$Level1=$o,$o2,$o3,$o4,$o5,$o6,$o7,$o8|group @{Expression={$_.PSObject.TypeNames[0]}}
$Level1|% {
Write-Host \&quot;Type\&quot; -fore Green
$_ |Format-Table
Write-Host \&quot;Type.OU\&quot; -fore DarkGreen
$_.Group|Group OU| Format-Table -Property Name, Count,Group -hidetableheaders -auto
}
[/code:1]

Message édité par: Laurent Dardenne, à: 6/10/13 14:35<br><br>Message édité par: Laurent Dardenne, à: 9/01/14 22:25

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.090 secondes
Propulsé par Kunena