PHP shell_exec в Windows не записывает в LPT1

#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.