Question Conception script mapper un partage réseau

Plus d'informations
il y a 1 an 9 mois - il y a 1 an 9 mois #32948 par Miaouh
Bonjour à tous, 
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 
Je souhaite que lorsque l'un de mes utilisateurs lance le script pour mapper le lecteur réseau spécifiques cela ouvre un répertoire correspondant à son script d'ouverture de session.
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 
Mes scripts sont habituellement en vbs mais je souhaite faire cela en powershell mais étant débutante cela me semble trop compliqué. Pouvez vous m'aider ? Merci à vous. 

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
Dernière édition: il y a 1 an 9 mois par Miaouh .

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

Plus d'informations
il y a 1 an 9 mois #32949 par Laurent Dardenne
Salut,
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.

Plus d'informations
il y a 1 an 9 mois - il y a 1 an 9 mois #32950 par Miaouh
En effet cela ne semble pas très clair !

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 ?
Dernière édition: il y a 1 an 9 mois par Miaouh .

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

Plus d'informations
il y a 1 an 9 mois - il y a 1 an 9 mois #32951 par Laurent Dardenne
>>Est ce plus clair ?
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 :

"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
 

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)

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
Dernière édition: il y a 1 an 9 mois par Laurent Dardenne. Raison: coquille

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

Plus d'informations
il y a 1 an 9 mois #32962 par Miaouh
Merci Laurent pour ces informations, en effet je pense que je vais passer par un fichier csv cela sera plus simple a maintenir vue l'infra.. !
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.

Plus d'informations
il y a 1 an 9 mois #32967 par Laurent Dardenne

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 ?

A priori oui.
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.

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