Продолжаю тему использования старых утилит с “особенным” синтаксисом из 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.
Как видите всё достаточно просто 🙂