Рубрики
Без рубрики

Сопоставление дисков на окнах

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Один из первых скриптов, которые мне пришлось помочь перевести из KIXTART в Python, был наши карту приводят скрипт. В нем мы бы накрыли накопители, основанные на какую группу, в которой пользователь был в и/или то, что сказал пользовательский реестр. Вот частичный пример каждой из этих категорий в KixTart:

Если readvalue («HKEY_LOCAL_MACHINE \ SPRECTED \ MYORG», @lserver \\ wildername ” Endif.

Если ingroup («DEPT XYZ») @LServer \\ Wildername «Else Endif

Теперь вы заметите, что этот скрипт вызывает еще один скрипт, называемый «ConnectDrive», чтобы сделать фактическое отображение. В основном все, что он содержит, был обработан ошибок и эти несколько строк:

: Instingdrive.

Используйте $ DRIVE/УДАЛИТЬ ИСПОЛЬЗОВАНИЕ $ DRIVE $ PATH

Теперь давайте посмотрим, что я использую в Python, чтобы заменить код KixTart. Во-первых, нам нужно получить группы, в которых есть пользователь. Вы заметите ниже, что есть два способа получить информацию о групповой информации, которую нам нужно использовать разные части пакета Pywin32.

from win32com.client import GetObject as _GetObject 

try:
    user = _GetObject("WinNT://%s/%s,user" % (pdcName, userid))
    fullName = user.FullName
    myGroups = _GetGroups(user)
except:
    try:
        from win32net import NetUserGetGroups,NetUserGetInfo
        myGroups = []
        groups = NetUserGetGroups(pdcName,userid)
        userInfo = NetUserGetInfo(pdcName,userid,2)
        fullName = userInfo['full_name']
        for g in groups:
            myGroups.append(g[0])
    except:
        fullname = "Unknown"
        myGroups = []

Тогда мы можем сделать отображение привода. Обратите внимание, что я пытаюсь отключить все, что уже отображается на букву диска, я хочу сопоставить. Я делаю это, потому что у нас есть пользователь, который подключит USB-накопители, которые захватывают диски, которые мои карты сценария. Иногда это работает, а иногда это не так.

import subprocess
import win32wnet
from win32netcon import RESOURCETYPE_DISK as DISK

drive_mappings = []
if "Dept XYZ" in myGroups:
    drive_mappings.append(('V:', '\\\\ServerName\\folderName'))

for mapping in drive_mappings:
    try:
        # Try to disconnect anything that was previously mapped to that drive letter
        win32wnet.WNetCancelConnection2(mapping[0],1,0)
    except Exception, err:
        print 'Error mapping drive!'

    try:
        win32wnet.WNetAddConnection2(DISK, mapping[0], mapping[1])
    except Exception, err:
        if 'already in use' in err[2]:
            # change the drive letter since it's being mis-assigned
            subprocess.call(r'diskpart /s \\%s\path\to\log\change_g.txt' % pdcName)
            # try mapping again
            win32wnet.WNetAddConnection2(DISK, mapping[0], mapping[1])

И это все, что есть к этому. Он закончился быть более сложным, чем было более сложным, чем было, но я думаю, что мой код более читабелен, и мне не нужно искать по нескольким файлам, чтобы понять его.