Особенности Net.exe Share

Продолжаю тему использования старых утилит с “особенным” синтаксисом из PowerShell. Следующий пациент – это Net share. Основной функционал этой команды вполне работает при вызове из PowerShell, но…

По умолчанию общие папки начиная с WIndows 2003 (если не ошибаюсь) создаются с разрешением everyone=read. Однако одной из рекомендованных практик раздачи разрешений является выдача на доступ к общей папке everyone=full control, и раздача необходимых разрешений уже средствами NTFS. Это сильно упрощает администрирование, так как не приходится сверять оба списка доступа.

Если посмотреть справку к команде net share то видно что разрешение можно задавать непосредственно в момент создания общей папки:

PS C:\Windows\System32> net share /?
The syntax of this command is:

NET SHARE
sharename
          sharename=drive:path [/GRANT:user,[READ | CHANGE | FULL]]
                               [/USERS:number | /UNLIMITED]
                               [/REMARK:"text"]
                               [/CACHE:Manual | Documents| Programs | None ]
          sharename [/USERS:number | /UNLIMITED]
                    [/REMARK:"text"]
                    [/CACHE:Manual | Documents | Programs | None]
          {sharename | devicename | drive:path} /DELETE
          sharename \\computername /DELETE

Однако если попробовать выполнить такую команду в PowerShell, у нас ничего не получится. Ну точнее net выведет справку по синтаксису, будто мы что то сделали неправильно…:

PS C:\Windows\System32> net share myshare=Q:\temp /GRANT:everyone,FULL
The syntax of this command is:
...

Что интересно, если запустить cmd.exe и выполнить в нём ту же команду, то всё отрабатывает прекрасно. В чем же дело? Выяснить как эта команда выглядит для net.exe поможет файл testargs.cmd который я описал в предыдущем посте из серии:

PS C:\Windows\System32> c:\root\testargs.cmd share myshare=Q:\temp /GRANT:everyone,FULL
Arg1: [share]
Arg2: [myshare]
Arg3: [Q:\temp]
Arg4: [/GRANT:everyone]
Arg5: [FULL]

Теперь хорошо видно что PowerShell посчитал /GRANT:everyone,FULL массивом из двух строк (из за запятой), и передал их утилите по отдельности. Избежать этого опять же несложно, либо замаскировать запятую с помощью обратного апострофа:

PS C:\Windows\System32> net share myshare=Q:\temp /GRANT:everyone`,FULL
myshare was shared successfully.

либо заключить последний параметр в кавычки.

PS C:\Windows\System32> net share myshare=Q:\temp "/GRANT:everyone,FULL" 
myshare was shared successfully.

Как видите всё достаточно просто🙂

Опубликовано в Command line parsing. Метки: , , , , . 1 Comment »

Один ответ to “Особенности Net.exe Share”

  1. Oleg Medvedev Says:

    Было бы интересно узнать, что делать с апострофами в путях.
    Если вызывать напрямую, то тут проблем нет — убежал от апострофа обратным — и вся недолга.
    Однако если я из другой проги получаю некий путь, а потом из неё же вызываю обработку этого пути powershellом, то команда
    powershell -command «script.ps1 file’s1.txt»
    естественно, вызывает ошибку.
    Повлиять на генерацию прогой путей я не могу, переименовывать пути — некошерно.
    Как powershell может получить свои аргументы буквально, потом заменить апостроф апострофом с обратным апострофом, а потом исполнить эти аргументы?


Обсуждение закрыто.

%d такие блоггеры, как: