Windows http server service

Настройка и настройка службы серверов

В этой статье описывается настройка и настройка службы Windows Server.

Исходная версия продукта: Windows Server 2012 R2
Исходный номер КБ: 128167

Аннотация

Хотя служба Windows Server самонастройка, ее также можно настроить вручную с помощью службы панели управления. Обычно параметры конфигурации сервера настраиваются автоматически (вычисляются и устанавливаются) при каждой загрузке Windows. Однако при запуске NET CONFIG SERVER в сочетании с параметром OR текущие значения автоматически настроенных параметров отображаются и регистрируются /AUTODISCONNECT /SERVCOMMENT в /HIDDEN реестре. После записи этих параметров в реестр вы не сможете настроить службу сервера с помощью сетей панели управления.

Если вы добавляете или удаляете системную память или меняете параметры размера сервера свести к минимуму, сбалансировать или увеличить максимальную величину), Windows не будет автоматически настраивать службу сервера для новой конфигурации. Например, при запуске и добавлении памяти на компьютер Windows не увеличивает вычисляемую величину автоматически NET CONFIG SRV /SRVCOMMENT настроенных записей.

При вводе NET CONFIG SERVER в запросе cmd без дополнительных параметров автонастройка остается без изменений, при этом отображаются полезные сведения о конфигурации сервера.

Дополнительные сведения

Служба серверов поддерживает уровни информации, которые могут устанавливать каждый параметр по отдельности. Например, команда NET CONFIG SRV /HIDDEN использует уровень информации 1016, чтобы установить только скрытый параметр. Однако NET.EXE запросов и устанавливает уровни информации 102 (скрытые, комментарии, пользователи и параметры диска) и 502. В результате все параметры на уровне информации окончательно заданы в реестре. SRVMGR.EXE и сервер панели управления и установите только уровень 102 (не уровень 502) при изменении комментария сервера.

Администраторы, желающие скрыть компьютеры с Windows в списке просмотра или изменить значение автоподключения, должны внести эти изменения с помощью REGEDT32.EXE вместо эквивалентов командной строки, рассмотренных выше. Комментарий сервера можно изменить с помощью поля описания applet сервера панели управления или диспетчера серверов.

Решение

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Для получения дополнительных сведений о том, как создать и восстановить реестр, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:
322756 Создание резервной копии и восстановление реестра Windows

Читайте также:  Сетевая прокси служба линукс

Чтобы восстановить параметры lan Manager Server до параметров по умолчанию или перенастроить Windows таким образом, чтобы она автоматически настраивала службу сервера:

Запустите редактор реестра (REGEDT32.EXE).

Из под HKEY_LOCAL_MACHINE подtree перейдите к следующему ключу:
\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

Удалите все записи, кроме следующих:
EnableSharedNetDrives
Lтовунс
NullSessionPipes
NullSessionShares
Size

Здесь могут быть другие записи, статически закодифицированные. Не удалять эти записи.

Запустите редактор реестра и перезапустите Windows.

About WinHTTP

For app containers and system services since Windows 10, version 1709, HTTP/2 (see RFC7540) is on by default.

Microsoft Windows HTTP Services (WinHTTP) provides you with a server-supported, high-level interface to the HTTP/2 and 1.1 Internet protocols. WinHTTP is designed to be used primarily in server-based scenarios by server applications that communicate with HTTP servers.

WinINet was designed as an HTTP client platform for interactive desktop applications. WinINet displays a user interface for some operations such as collecting user credentials. WinHTTP, however, handles these operations programmatically. Server applications that require HTTP client services should use WinHTTP instead of WinINet. For more information, see Porting WinINet Applications to WinHTTP.

WinHTTP is also designed for use in system services and HTTP-based client applications. However, single-user applications that require FTP protocol functionality, cookie persistence, caching, automatic credential dialog handling, Internet Explorer compatibility, or downlevel platform support should consider using WinINet.

This interface is accessible from C/C++ by using either the WinHTTP application programming interface (API), or by using the IWinHttpRequest and IWinHttpRequestEvents interfaces. WinHTTP is also accessible from script and Microsoft Visual Basic through the WinHTTP object. For more information and descriptions of the individual functions, see the WinHTTP functions reference for the specific language.

Starting with WindowsВ 8, WinHTTP provides APIs to enable connections using the WebSocket Protocoll, such as WinHttpWebSocketSend and WinHttpWebSocketReceive.

WinHTTP is not reentrant except during asynchronous completion callback. That is, while a thread has a call pending to one of the WinHTTP functions such as WinHttpSendRequest, WinHttpReceiveResponse, WinHttpQueryDataAvailable, WinHttpSendData, or WinHttpWriteData, it must never call WinHTTP a second time until the first call has completed. One scenario under which a second call could occur is as follows: If an application queues an Asynchronous Procedure Call (APC) to the thread that calls into WinHTTP, and if WinHTTP performs an alertable wait internally, the APC can run. If the APC routine happens also to call WinHTTP, it reenters the WinHTTP API, and the internal state of WinHTTP can be corrupted.

Читайте также:  Windows 10 rs2 release build

WinHTTP 5.1 Features

The following features were added in version 5.1 of WinHTTP:

  • IPv6 support.
  • AutoProxy capabilities.
  • HTTP/1.0 protocol, including support for keep-alive (persistent) connections and session cookies.
  • HTTP/1.1 chunked transfer support for HTTP responses.
  • Keep-alive pooling of anonymous connections across sessions.
  • Secure Sockets Layer (SSL) functionality, including client certificates. Supported SSL protocols include the following: SSL 2.0, SSL 3.0, and Transport Layer Security (TLS) 1.0.
  • Support for server and proxy authentication, including integrated support for Microsoft Passport 1.4 and the Negotiate/ Kerberos package.
  • Automatic handling of redirects unless suppressed.
  • Scriptable interface in addition to the API.
  • Trace utility to help troubleshoot problems.

A number of WinINet features are not supported in WinHTTP, including URL caching and persistent cookies, autoproxy, autodialing, offline support, and File Transfer Protocol (FTP).

For more information about changes introduced in version 5.1, see What’s New in WinHTTP 5.1.

Getting Started with WinHTTP

For more information about WinHTTP, see the following topics.

  • WinINet vs. WinHTTP compares the two technologies for accessing HTTP.
  • WinHTTP Versions describes the version history of WinHTTP.
  • What’s New in WinHTTP 5.1 describes changes and new features in WinHTTP 5.1.
  • Network Terminology describes useful concepts and terminology relating to networking in general and the HTTP protocol in particular.
  • Choosing a WinHTTP Interface describes the C/C++ API and the COM interface for WinHTTP.
  • WinHTTP Security Considerations describes security issues to be aware of when using WinHTTP.
  • Porting WinINet Applications to WinHTTP describes how to modify your existing WinINet applications to use the WinHTTP API.

—>

Создание своего Windows Service

Я решил провести один эксперимент, суть его пока не могу разглашать, но по результатам обязательно опишу его))) Для этого эксперимента, мне нужно написать приложение которое работает как сервис в Windows.

Думаю описывать как создавать обычный Win32 Console Application проект в Visual Studio нет надобности )))

С чего начинается сервис?

int _tmain( int argc, _TCHAR* argv[]) <
SERVICE_TABLE_ENTRY ServiceTable[1];
ServiceTable[0].lpServiceName = serviceName;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

SERVICE_TABLE_ENTRY это структура, которая описывает точку входа для сервис менеджера, в данном случаи вход будет происходить через ф-цию ServiceMain. Функция StartServiceCtrlDispatcher собственно связывает наш сервис с SCM (Service Control Manager)

Точка входа сервиса

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

void ServiceMain( int argc, char ** argv) <
int error;
int i = 0;

serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwServiceSpecificExitCode = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;

Читайте также:  Как протестировать установленный windows

serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, (LPHANDLER_FUNCTION)ControlHandler);
if (serviceStatusHandle == (SERVICE_STATUS_HANDLE)0) <
return ;
>

error = InitService();
if (error) <
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return ;
>

serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (serviceStatusHandle, &serviceStatus);

while (serviceStatus.dwCurrentState == SERVICE_RUNNING)
<
char buffer[255];
sprintf_s(buffer, «%u» , i);
int result = addLogMessage(buffer);
if (result) <
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return ;
>
i++;
>

void ControlHandler(DWORD request) <
switch (request)
<
case SERVICE_CONTROL_STOP:
addLogMessage( «Stopped.» );

serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return ;

case SERVICE_CONTROL_SHUTDOWN:
addLogMessage( «Shutdown.» );

serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return ;

ControlHandler вызывается каждый раз, как SCM шлет запросы на изменения состояния сервиса. В основном ее используют для описания корректной завершении работа сервиса.

Установка сервиса

sc create SampleService binpath= c:\SampleService.exe

if (argc — 1 == 0) <
SERVICE_TABLE_ENTRY ServiceTable[1];
ServiceTable[0].lpServiceName = serviceName;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

if (!StartServiceCtrlDispatcher(ServiceTable)) <
addLogMessage( «Error: StartServiceCtrlDispatcher» );
>
> else if ( wcscmp(argv[argc-1], _T( «install» )) == 0) <
InstallService();
> else if ( wcscmp(argv[argc-1], _T( «remove» )) == 0) <
RemoveService();
> else if ( wcscmp(argv[argc-1], _T( «start» )) == 0 ) <
StartService();
>
>

int InstallService() <
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (!hSCManager) <
addLogMessage( «Error: Can’t open Service Control Manager» );
return -1;
>

SC_HANDLE hService = CreateService(
hSCManager,
serviceName,
serviceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
servicePath,
NULL, NULL, NULL, NULL, NULL
);

if (!hService) <
int err = GetLastError();
switch (err) <
case ERROR_ACCESS_DENIED:
addLogMessage( «Error: ERROR_ACCESS_DENIED» );
break ;
case ERROR_CIRCULAR_DEPENDENCY:
addLogMessage( «Error: ERROR_CIRCULAR_DEPENDENCY» );
break ;
case ERROR_DUPLICATE_SERVICE_NAME:
addLogMessage( «Error: ERROR_DUPLICATE_SERVICE_NAME» );
break ;
case ERROR_INVALID_HANDLE:
addLogMessage( «Error: ERROR_INVALID_HANDLE» );
break ;
case ERROR_INVALID_NAME:
addLogMessage( «Error: ERROR_INVALID_NAME» );
break ;
case ERROR_INVALID_PARAMETER:
addLogMessage( «Error: ERROR_INVALID_PARAMETER» );
break ;
case ERROR_INVALID_SERVICE_ACCOUNT:
addLogMessage( «Error: ERROR_INVALID_SERVICE_ACCOUNT» );
break ;
case ERROR_SERVICE_EXISTS:
addLogMessage( «Error: ERROR_SERVICE_EXISTS» );
break ;
default :
addLogMessage( «Error: Undefined» );
>
CloseServiceHandle(hSCManager);
return -1;
>
CloseServiceHandle(hService);

CloseServiceHandle(hSCManager);
addLogMessage( «Success install service!» );
return 0;
>

int RemoveService() <
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!hSCManager) <
addLogMessage( «Error: Can’t open Service Control Manager» );
return -1;
>
SC_HANDLE hService = OpenService(hSCManager, serviceName, SERVICE_STOP | DELETE);
if (!hService) <
addLogMessage( «Error: Can’t remove service» );
CloseServiceHandle(hSCManager);
return -1;
>

DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
addLogMessage( «Success remove service!» );
return 0;
>

int StartService() <
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
SC_HANDLE hService = OpenService(hSCManager, serviceName, SERVICE_START);
if (!StartService(hService, 0, NULL)) <
CloseServiceHandle(hSCManager);
addLogMessage( «Error: Can’t start service» );
return -1;
>

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return 0;
>

SampleService.exe install
SampleService.exe remove
SampleService.exe start

Продолжение следует, если все не забракуют 🙂

Оцените статью