партия и для каждой записи - PullRequest
0 голосов
/ 04 мая 2018

Нам нужен пакетный скрипт, чтобы увидеть, какие сопоставления уже активны, удалить сопоставление и переназначить его один раз, но с новым паролем.

У меня есть следующий пример кода:

@echo off
set server=srv1

for /f "tokens=1,2*" %%a in ('wmic logicaldisk get Caption^, providername^| find /I "%server%"')  do ( 
    for /f "tokens=1,2*" %%d in ("%%a") do ( 
        echo net use %%a /del 
        for /f "tokens=1,2*" %%e in ("%%a", "%%b") do (
            echo net use %%a %%b /user:dom/uid1 pwd
        )
    )
)        

Проблема в том, что мне нужно сначала удалить все сопоставления, а затем сделать все переназначения.

Мой текущий код делает: удаление, переназначение, удаление, переназначение.

Может ли кто-нибудь помочь мне с примером кода?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Большое спасибо aschipfl! Скипты работают очень хорошо! Я добавил еще одну часть о cmdkey для обработки User / PWD при подключении к нескольким Доменам. Наконец, вот мой сборник:

@echo off
::# ------------------------------------------------------------------
::# specify Server Name (FQDN or IP Adresse)
::# IP: 10.0.0.1
::# FQDN: srv1.foo.bar
::# ------------------------------------------------------------------
set SERVER=10.0.0.1
::#
::# ------------------------------------------------------------------
::# delete old mappings for Server
::# ------------------------------------------------------------------
rem // Initialise index counter:
set /A "COUNT=0"
rem /* Capture output of the `wmic` command line that is filtered by a `where` clause;
rem    this returns only the drives, filtered for network drives (`DriveType=4`);
rem    two nested loops avoid text conversion artefacts like orphaned CR marks: */
for /F "delims=" %%K in ('
    wmic LogicalDisk where "DriveType=4 and ProviderName like '\\\\%SERVER%\\%%'" get DeviceID /VALUE
') do for /F "tokens=1* delims==" %%I in ("%%K") do (
    rem /* Capture output of the `wmic` command line that returns the mapping target
    rem    that corresponds with the current drive: */
    for /F "delims=" %%G in ('
        wmic LogicalDisk where "DeviceID='%%J'" get ProviderName /VALUE
    ') do for /F "tokens=1* delims==" %%E in ("%%G") do (
        rem // Increment index counter:
        set /A "COUNT+=1"
        rem // Revert handling of `&` by `wmic`, hence replace `&` by `&`:
        set "NAME=%%F" & call set "NAME=%%NAME:&=&%%"
        rem /* Store current mapping into array-like variable;
        rem    `call` and double-`%` in `%%COUNT%%` are necessary as `COUNT` is modified
        rem    and read within the same block of code (`%COUNT%` would return `0`): */
        call set "$MAP[%%COUNT%%]=%%J|%%NAME%%"
        rem // Delete the current mapping:
        net use %%J /DELETE
        cmdkey /delete:%SERVER%
    )
)
::#
::# ------------------------------------------------------------------
::# Get User Information
::# ------------------------------------------------------------------
set /p U-ID=Bitte U-ID eingeben: 
set /p Pwd=Bitte das NEU vergebene Passwort eingeben: 
::#
::# ------------------------------------------------------------------
::# New mappings for Server
::# ------------------------------------------------------------------
rem // Loop over all array elements:
for /F "tokens=1-2* delims=|=" %%H in ('2^> nul set $MAP[') do (
    rem // Establish remapping with new user data:
    cmdkey /add:%SERVER% /user:%U-ID%@foo.bar /pass:%PWD%
    net use %%I "%%J" /PERSISTENT:YES
    rem // Delete handled array element:
    set "%%H="
)

Конечно, командный ключ запускает несколько раз, но это нормально. Большое спасибо за помощь! Beste regrads AxelF

0 голосов
/ 04 мая 2018

Чтобы сделать то, что вы хотите, вам нужно сохранить текущие сопоставления. Я бы сделал это в переменных массива, таких как $MAP[1], $MAP[2], например. Поскольку атрибут Caption всегда выглядит как буква диска плюс двоеточие, а атрибут ProviderName всегда выглядит как UNC-путь, переменная $MAP[1] может содержать что-то вроде <Caption>|<ProviderName>.

Итак, давайте установим два отдельных цикла, где первый выполняет удаление и хранение данных, а второй выполняет действия по переназначению - например, так:

@echo off
set "SERVER=srv1"

rem // Initialise index counter:
set /A "COUNT=0"
rem /* Capture output of the `wmic` command line that is filtered by a `where` clause;
rem    this returns only the drives, filtered for network drives (`DriveType=4`);
rem    two nested loops avoid text conversion artefacts like orphaned CR marks: */
for /F "delims=" %%K in ('
    wmic LogicalDisk where "DriveType=4 and ProviderName like '\\\\%SERVER%\\%%'" get DeviceID /VALUE
') do for /F "tokens=1* delims==" %%I in ("%%K") do (
    rem /* Capture output of the `wmic` command line that returns the mapping target
    rem    that corresponds with the current drive: */
    for /F "delims=" %%G in ('
        wmic LogicalDisk where "DeviceID='%%J'" get ProviderName /VALUE
    ') do for /F "tokens=1* delims==" %%E in ("%%G") do (
        rem // Increment index counter:
        set /A "COUNT+=1"
        rem // Revert handling of `&` by `wmic`, hence replace `&amp;` by `&`:
        set "NAME=%%F" & call set "NAME=%%NAME:&amp;=&%%"
        rem /* Store current mapping into array-like variable;
        rem    `call` and double-`%` in `%%COUNT%%` are necessary as `COUNT` is modified
        rem    and read within the same block of code (`%COUNT%` would return `0`): */
        call set "$MAP[%%COUNT%%]=%%J|%%NAME%%"
        rem // Delete the current mapping:
        ECHO net use %%J /DELETE
    )
)

rem // Loop over all array elements:
for /F "tokens=1-2* delims=|=" %%H in ('2^> nul set $MAP[') do (
    rem // Establish remapping with new user data:
    ECHO net use %%I "%%J" pwd /USER:dom/uid1
    rem // Delete handled array element:
    set "%%H="
)

Конечно, сначала вам нужно установить и адаптировать переменную фильтра SERVER (используется для предложения where, которое заменяет вашу команду find). Я изменил строку поиска на \\%SERVER%\, поэтому сопоставляются только полные имена серверов.

Этот подход правильно обрабатывает сетевые пути, содержащие ПРОБЕЛЫ и амперсанды (&).

Чтобы действительно удалить и переназначить удаленные пути, удалите команды ECHO в верхнем регистре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...