понедельник, 14 января 2013 г.

Управление службами через командную строку (консоль) Windows

Для работы со службами в Windows, существует утилита командной строки sc, также для управления можно использовать утилиту net. В данной стать я не буду пытаться описать все их параметры. Цель статьи - показать как со службами производить основные действия: установка, удаление, запуск, остановка.

KickNetwork: "пинаем" глючный сетевой адаптер

Появился у меня глючный китайский PCI WiFi адаптер TP-LINK 150Mbps Wireless N Adapter (PCI\VEN_168C&DEV_002D). Не то чтобы совсем глючный, с большего он работает вполне себе хорошо, но совершенно не любит p2p соединения: так и норовит перестать видеть роутер при запущенном uTorrent'e. Другими словами, мой WiFi-адаптер, то и дело пишет "соединение ограничено", хотя на других устройствах WiFi работает замечательно и роутер ни при чём. Уж не знаю почему так происходит, вот только перестановка дров ничего не дала. Однако, было замечено, что достаточно переподключиться к беспроводной сети и проблема на время исчезает. Но есть загвоздка: т.к. соединение не рвётся, выключать и включать соединение надо вручную. Чтож, займёмся нашим любимым делом, проектированием "костылей".

Функция выполнения консольной команды в Delphi (в том числе в 2009, 2010, XE)

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  CmdLine :=Filename+ Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

Функция определения каталога Windows в Delphi

function GetWindowsDir: string;
var
p : PChar;
begin
GetMem(p, MAX_PATH);
result := '';
if GetWindowsDirectory(p, MAX_PATH) > 0 then
result := string(p);
FreeMem(p);
end;

Системные ошибки Windows. Их перехват в Delphi



В Delphi код  последней системной ошибки живет в GetLastError

Перечень системный ошибок Windows, с которыми мне довелось встретится:
123 - Ошибка соединения
267 - Неверное имя папки

воскресенье, 13 января 2013 г.

Включение и отключение сетевого адаптера (интерфейса) через консоль Windows


Включить (отключить) сетевой адаптер (интерфейс) в Windows через консоль можно используя системную утилиту netsh, выглядеть команда будет следующим образом:

netsh interface set interface name="Имя сетевого интерфейса" admin=enable //включение
netsh interface set interface name="Имя сетевого интерфейса" admin=disable //отключение
Просмотреть сетевые интерфейсы в системе можно командой:
netsh  interface show interface
Следует помнить, что в случае, если имя сетевого интерфейса имеет русские символы, то, при использовании команды из bat-файла, необходимо учесть возможные проблемы с кодировкой, рассмотренные в этой статье.
Так же, не забывайте, что в Windows 7, данную команду надо выполнять от имени администратора.
Подробнее об утилите netsh можно почитать в Википедии

Ошибка XCOPY "Недопустимы путь". Использование русских символов в комманде XCOPY.

Команда виндовой консоли (cmd)  XCOPY гораздо лучше своего досовского собрата COPY тем, что позволяет копировать всё содержимое папки с подпапками, что не заменимо при написании bat-файлов для задач резервного копирования. И, если описание этой команды найти не сложно (например, тут), то описание ошибок практически невозможно.
Обычно после написания первого скрипта мы получаем ошибку "Недопустимый путь".
Вызвана она может быть следующими причинами (в продолжении):