#php #windows #apache #permissions #shell-exec
#php #Windows #apache #разрешения #shell-exec
Вопрос:
Я переношу небольшой фрагмент кода, который я написал, из linux в Windows, мне в основном нужно отправить код ZPL на принтер zebra, подключенный через usb. Нет проблем с shell_exec и lp в linux.
В Windows я сопоставил usb-принтер с LPT1, и здесь никаких проблем, и если я повторяю свой код (или копирую файл) в LPT1 (в cmd), все работает. Нравится:
copy C:zplcode.txt LPT1 *or* echo "zplcode here" > LPT1
мои материалы печатаются.
Теперь, как я уже сказал, это работает безупречно в cmd, но если я shell_exec это, это не сработает. Я думал, что shell_exec вообще не работает, но это так. Фактически, echo shell_exec('ver')
возвращает мою версию Windows. И где copy C:zplcode.txt LPT1
возвращает «1 скопированный файл» в cmd, echo shell_exec('copy c:zplcode.txt LPT1')
возвращает «0 скопированных файлов». Это также происходит, если я пытаюсь скопировать любой обычный файл или повторить его.
Это похоже на то, что у apache нет прав на запись или что-то в этом роде, но все же это не так, как в Linux, где у него есть свой пользователь, это служба, работающая как system … вы можете помочь? Спасибо
редактирование 2: я решил свою проблему, отключив UAC и принудительно запустив службу apache от имени администратора, а затем выполнив shell_exec("echo zplcode here > ///localhost//printer")
where printer — это имя, которое я присвоил своему принтеру при его совместном использовании. Я предполагаю, что проблема все еще существует, поскольку я не мог отправить данные в LPT1, если бы мне это было нужно (если только не делиться ими и не делать то, что я сделал здесь).
Комментарии:
1.
system
технически это все еще учетная запись в Windows.2. неопределенный отладочный тест:
exec('echo %USERNAME%')
иshell_exec('echo %USERNAME%')
посмотрите, есть ли какие-либо различия между ними. Не вижу, как, но кто знает… Windows иногда может быть странной.3. странно … оба возвращают имя компьютера, за которым следует $
4. @JonathanKuhn: технически это примитив безопасности; в нем отсутствуют некоторые свойства учетной записи (например, нет пароля, нет даты истечения срока действия, нет полного имени). Однако в данном случае это различие не особенно актуально.
![]()
5. Вы говорите, что «сопоставили USB-принтер с LPT1»; такие сопоставления являются локальными для сеанса входа пользователя в систему или, возможно, для сеанса удаленного рабочего стола, я не уверен. В любом случае служба не увидит его, даже если настроена для запуска под той же учетной записью пользователя.
Ответ №1:
Вы говорите, что «сопоставили USB-принтер с LPT1»; такие сопоставления являются локальными для сеанса входа пользователя в систему (или, возможно, для сеанса удаленного рабочего стола, я не уверен).
В любом случае служба не увидит его, даже если настроена для запуска под той же учетной записью пользователя. Каждая служба получает отдельный сеанс входа в систему, и начиная с Windows Vista, только службы запускаются в сеансе удаленного рабочего стола 0.