最近项目客户要求做一个功能,内容是希望希望用户在登录windows的时候,根据用户自己负责的项目来自动创建网络映射驱动器,用户需要映射磁盘的信息都存在数据库中。经过调查研究,打算使用powershell实现,实现方式大体如下:
1.先创建powershell脚本,代码如下:
#获取当前用户 $currentAccountName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name; #通过用户名查询出该用户应该映射的路径、和映射路径的用户名和密码(过程略) ##...... #模拟一个映射列表和登录名密码,作为上面的查询结果 $diskList = @("\\192.168.22.141\AD","\\192.168.22.141\OracleExportShell"); $accountName = "Administrator"; $password = "zhang.ruyi123"; #创建wscript.network对象 $driver = New-Object -ComObject wscript.network; #移除所有网络驱动器 Get-WmiObject Win32_Networkconnection | ForEach-Object { $driver.RemoveNetworkDrive($_.LocalName,$true,$false); } #查询所有逻辑驱动器 $logicalDiskList = (@()); Get-WmiObject Win32_Logicaldisk | ForEach-Object { $logicalDiskList += $_.DeviceID; } #所有驱动器列表 $deviceQueue = New-Object -TypeName System.Collections.Generic.Queue[System.String]; $deviceQueue.Enqueue("A:"); $deviceQueue.Enqueue("B:"); $deviceQueue.Enqueue("C:"); $deviceQueue.Enqueue("D:"); $deviceQueue.Enqueue("E:"); $deviceQueue.Enqueue("F:"); $deviceQueue.Enqueue("G:"); $deviceQueue.Enqueue("H:"); $deviceQueue.Enqueue("I:"); $deviceQueue.Enqueue("J:"); $deviceQueue.Enqueue("K:"); $deviceQueue.Enqueue("L:"); $deviceQueue.Enqueue("M:"); $deviceQueue.Enqueue("N:"); $deviceQueue.Enqueue("O:"); $deviceQueue.Enqueue("P:"); $deviceQueue.Enqueue("Q:"); $deviceQueue.Enqueue("R:"); $deviceQueue.Enqueue("S:"); $deviceQueue.Enqueue("T:"); $deviceQueue.Enqueue("U:"); $deviceQueue.Enqueue("V:"); $deviceQueue.Enqueue("W:"); $deviceQueue.Enqueue("X:"); $deviceQueue.Enqueue("Y:"); $deviceQueue.Enqueue("Z:"); #添加指定驱动器 $diskList | ForEach-Object{ $deviceId = $null; while($true){ $deviceId = $deviceQueue.Dequeue(); if(($logicalDiskList -notcontains $deviceId) -or ($deviceQueue.Count -eq 0)){ break; } } #查询出一个可用的驱动器名 if($deviceQueue.Count -ne 0){ $driver.MapNetworkDrive($deviceId,$_,$false,$accountName,$password); } }
上述脚本的功能是获取当前用户登录名,然后根据登录名调用webservice来查询所需要的信息,然后删除已有的网络映射,在创建出新的网络映射。如何使用powershell调用webservice,请参考http://zhangruyi5599.iteye.com/blog/1571532。
2.将写好的powershell放在域控上,然后将这个脚本挂载到组策略对象的登录事件中,就OK了。