Question Conception script mapper un partage réseau
- Miaouh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
J'ai une infrastructure ou chaque utilisateur a un script .bat d'ouverture de session.
Par exemple :
- USER01 a USER50 au lancement de leur session ouvriront Plop1.bat
- USER51 a USER100 au lancement de leur session ouvriront Plop2.bat
Par exemple :
- USER30 a un script d'ouverture de session Plop1.bat, le script pour mapper le lecteur réseau spécifiques devra ouvrir sur la lettre R : \\toto.domain.fr\directory\EF001
- USER80 a un script d'ouverture de session Plop2.bat, le script pour mapper le lecteur réseau spécifiques devra ouvrir sur la lettre R : \\toto.domain.fr\directory\EF150
Voici un bout de mon script en vbs si ca peut vous aider a comprendre :
Dim WshShell, objFSO, objFolder, fso
Dim objNetwork, objUser, CurrentUser, strGroup, NomScript
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set fso = CreateObject("Scripting.FileSystemObject")
Set objNetwork = WScript.CreateObject("WScript.Network")
Set objUser = CreateObject("AdSystemInfo")
Set CurrentUser = GetObject("LDAP://" & objUser.UserName)
strGroup = LCase(join(CurrentUser.MemberOf))
NomScript = CurrentUser.ScriptPath
Const USER30 = "Plop1.bat"
If InStr(NomScript, USER30) Then
objNetwork.RemoveNetworkDrive "r:"
objNetwork.MapNetworkDrive "r:", "\\toto.domain.fr\directory\EF001"
End If
Const USER80 = "Plop2.bat"
If InStr(NomScript, USER80) Then
objNetwork.RemoveNetworkDrive "r:"
objNetwork.MapNetworkDrive "r:", "\\toto.domain.fr\directory\EF150"
End If
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
dans ton énoncé, le point suivant pose 'problème' :
Par exemple :
USER01 a USER50 au lancement de leur session ouvriront Plop1.bat
USER51 a USER100 au lancement de leur session ouvriront Plop2.bat
A priori 'USER01 a USER50' ne peut être qu'un groupe d'utilisateurs, sauf si ta convention de nommage de compte est User+Numero.
Que se passe-t-il pour un nouveau compte ? ex : USER100+1 --> USER101
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Miaouh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
Donc si mon utilisateur User01 (non la nomenclature est initiale du prenom point nom J.Dupont) fait partie du groupe AD EF01 il aura un script d'ouverture de session Plop1.bat et donc nous mapperons le lecteur R:\ avec un chemin \\toto.domain.fr\directory\EF001
Donc si mon utilisateur User150 (non la nomenclature est initiale du prenom point nom A.Peanut) fait partie du groupe AD EF03 il aura un script d'ouverture de session Plop3.bat et donc nous mapperons le lecteur R:\ avec un chemin \\toto.domain.fr\directory\EF003
Est ce plus clair ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
oui.
>>étant débutante cela me semble trop compliqué.
Découpe tes traitements et teste les un par un dans la console.
Il reste à implémenter l'association user-groupe-mapping.
Soit coder en dur dans le script soit un fichier de configuration (sur un share).
Un .csv peut suffire :
Enfin reste à obtenir le nom de groupe sur le poste client, le module Powershell AD n'est à priori pas disponible, il faut utiliser ADSI ( voir ci dessous la fonction Get-ADSIObject)"GroupName";"DriveName";"Share"
CN=LgsGrp1,CN=Users,DC=Truc,DC=Bidule;H;\\server\SYSVOL\xyz\scripts\Testgrp\Grp1
CN=LgsGrp2,CN=Users,DC=Truc,DC=Bidule;X;\\server\SYSVOL\xyz\scripts\Testgrp\Grp2
Un peu de code de gestion des drives (extrait d'un code de prod ) :
#Les variables sont accessibles pour tout le code de ce script
New-Variable -Name CurrentDate -Value ([Datetime]::Now) -Option ReadOnly -Scope script
#Nom du chemin du serveur sur lequel est hébergé les fichiers de mapping et de configuration
New-Variable -Name RemoteDatasPath -Value '\\server\SYSVOL\xyz\scripts' -Option ReadOnly -Scope script
#Nom du chemin local où sont hébergé les fichiers de mapping et de configuration
New-Variable -Name DatasPath -Value 'C:\temp\Log\Datas' -Option ReadOnly -Scope script
#Nom du chemin local du répertoire hébergeant les fichiers de log
New-Variable -Name LogsPath -Value 'C:\Temp\Log' -Option ReadOnly -Scope script
#pattern de formatage, d'après la date courante, du nom du répertoire du jour
New-Variable -Name PatternLogDirectoryName -Value '{0:yyMM}' -Option ReadOnly -Scope script
#pattern de formatage, d'après la date courant, du nom du fichier de log du jour
New-Variable -Name PatternLogFileName -Value '{0:yyMMdd-HHmm}.Log' -Option ReadOnly -Scope script
#Construction du fichier de log du jour
New-Variable -Name LogFileName -value ("$LogsPath\$PatternLogDirectoryName\$PatternLogFileName" -F $CurrentDate) -Option ReadOnly -Scope script
#Chemin LDAP utiliser pour les interrogations AD
New-Variable -Name RootHosting -value 'LDAP://truc.bidule' -Option ReadOnly -Scope script
#Le nom du fichier de configuration est figé
New-Variable -Name ConfigFilename -value 'MyConfig.xml' -Option ReadOnly -Scope script
#Nom du fichier de mapping des lecteurs réseau
#Le nom du fichier sera complété dynamiquement avec le numéro de version + extension 'csv'
New-Variable -Name CsvFilename -value 'Mapping' -Option ReadOnly -Scope script
#Le nom du fichier sera complété avec le numéro de version + extension 'csv'
New-Variable -Name CurrentCsvFilename -value 'DefaultName' -Scope script
#Crée le répertoire de log pour le jour courant
$xmlErrorPath="$LogsPath\$PatternLogDirectoryName" -F $CurrentDate
md $xmlErrorPath -EA silentlyContinue
md $DatasPath -EA silentlyContinue
#Objet de création de drive réseau
$global:WSNetWork = New-Object -ComObject WScript.Network
function New-NetworkDrive {
<#
.synopsis
A function to create Networkdrives
.Example
New-NetworkDrive 'x' '\\localhost\C$'
.Example
New-NetworkDrive 'Y:' '\\localhost\C$\Windows'
#>
Param(
[string]$Drive,
[string]$Unc
)
$Drive = ValideDrivename $Drive
try {
"Create network drive : $Drive on $Unc" >> $script:LogFileName
$global:WSNetWork.MapNetworkDrive($Drive, $Unc)
}
catch{
Write-Error $_.Exception.Message
@"
Un problème est survenu lors de la création lecteur réseau $Drive.
L'erreur était :
$_
"@ >> $script:LogFileName
}
}#New-NetworkDrive
function Get-NetworkDrives{
<#
.synopsis
A function to list the currently mapped Networkdrives
.Example
Get-NetworkDrives
#>
# try {
$mappedDrives = @{}
#l'appelant gére les possibles erreurs
$a = $global:WSNetWork.EnumNetworkDrives()
$anz = $a.count()
for ($i = 0; $i -lt $anz; $i = $i + 2)
{
$drive = $a.item($i)
$path = $a.item($i+1)
$mappedDrives[$drive] = $path
}
$mappedDrives
}#Get-NetworkDrives
function Remove-NetworkDrive{
param($Drive)
<#
.synopsis
A function to remove Networkdrives
.Example
Remove-NetworkDrive X
.Example
Remove-NetworkDrive Y:
#>
$Drive = ValideDrivename $Drive
try {
$global:WSNetWork.RemoveNetworkDrive($Drive)
}
catch{
Write-Error $_.Exception.Message
@"
Un problème est survenu lors de la suppression du lecteur réseau $Drive.
L'erreur était :
$_
"@ >> $script:LogFileName
}
}#Remove-NetworkDrive
function Remove-AllNetworkDrive
{
try {
$AllDrives=Get-NetworkDrives
$AllDrives.GetEnumerator()|
Foreach {
"Remove network drive : $($_.key)=$($_.value)" >> $script:LogFileName
Remove-NetworkDrive $_.Key
}
}
catch{
Write-Error $_.Exception.Message
@"
Un problème est survenu lors de la suppression des lecteurs réseau.
L'erreur était :
$_
"@ >> $script:LogFileName
}
}#Remove-AllNetworkDrive
function Get-ADSIObject {
<#
.DESCRIPTION
Name: Adapted from Get-UserADProperties.ps1, le 21/06/13
Version: .9
AUTHOR: James Vierra , Designed Systems & Services
DATE : 8/20/2011
.LINK
http://gallery.technet.microsoft.com/scriptcenter/Extract-arbitrary-list-of-6f59d3b4#
#>
#requires -version 2
Param(
[Parameter(Mandatory=$true,Position=0,HelpMessage='LDAP filter')]
[ValidateNotNullOrEmpty()]
[string]$filter,
[Parameter(Mandatory=$true,Position=1,HelpMessage='LDAP path of container to root search in')]
[ValidateNotNullOrEmpty()]
[string]$searchRoot,
[Parameter(Mandatory=$false,Position=2,ValueFromPipelineByPropertyName=$true,HelpMessage='An array of property names')]
[ValidateNotNullOrEmpty()]
[string[]]$properties=@('samaccountname','sn','description'),
[Parameter(Mandatory=$false,Position=3,HelpMessage='PageSize for returned entries')]
[int]$PageSize=500,
[switch] $All,
[switch] $Raw
)
process{
try {
$searcher=[adsisearcher]$filter
$searcher.PageSize=$pagesize
if (-not $All)
{ $searcher.PropertiesToLoad.AddRange($properties) }
$searcher.SearchRoot=$searchRoot
if (-not $All)
{
$searcher.FindAll() |
ForEach-Object{
$hash=@{}
foreach($name in $properties)
{
if($_.Properties[$name])
{ $hash.$name=$_.Properties[$name] }
else
{ $hash.$name=$null }
}
Write-Output (New-Object PSObject -Property $hash)
}
}
else
{ $searcher.FindAll() }
}
finally {
if ($searcher -ne $null)
{$searcher.Dispose()}
}
}#process
} #Get-ADSIObject
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Miaouh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
J'ai regardé un peu le script de prod mais il me semble trop complexe pour la situation. Une boucle sera surement plus adapté a ma situation.
Par contre je vais devoir utiliser les modules AD afin d'interroger l'appartenance de l'utilisateur a un groupe AD mon serveur communique bien avec l'AD les ports LDAP et LDAPS sont ouverts et nous avons installé et importé les modules AD powershell.
Si mon utilisateur fait partie d'un des groupes de mon CSV il faudra mapper le partage réseau indiqué dans mon csv.
Cela est-il faisable ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
A priori oui.Si mon utilisateur fait partie d'un des groupes de mon CSV il faudra mapper le partage réseau indiqué dans mon csv.
Cela est-il faisable ?
Cependant en relisant cela :
Je souhaite que lorsque l'un de mes utilisateurs lance le script.
ceci me fait douter, un peu :
.. mon serveur communique bien avec l'AD les ports LDAP et LDAPS sont ouverts et nous avons installé et importé les modules AD powershell.
Dans quel contexte ce script est exécuté, celui du serveur ou celui de chaque utilisateur ?
>>J'ai regardé un peu le script de prod mais il me semble trop complexe pour la situation.
Complexe pas vraiment, il gère les erreurs afin de les loguer. Un loginscript qui génère des erreurs, ça fait des heureux/ses au support
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Conception script mapper un partage réseau