Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи з ОС (win32API).doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
195 Кб
Скачать
☆

Лабораторна робота 8 Тема: Мережні засоби операційних систем

Завдання:

1.Дослідити роботу програми для обміну текстовими повідомленнями через мережу.

2.Описати документацію на типи даних, структури та функції, які використовуються в програмі.

3.За завданням викладача розробити власний проект на основі існуючого.

Послідовність виконання:

1 Помістіть на форму програми-сервера компоненти TIdTCPServer, TMemo і заповніть код:

//конструктор форми

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

IdTCPServer1->DefaultPort=8090;//задати порт

IdTCPServer1->Active=true;//зробити сервер активним

Memo1->Lines->Clear();//очистити Memo1

}

//обробник події OnExecute компонента IdTCPServer1

//AThread - потік, який використовується для клієнтських з'єднань

void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)

{

try

{//добавити в Memo1 отриманий рядок

Memo1->Lines->Add(AThread->Connection->ReadLn());

//добавити в Memo1 віддалену IP адресу

Memo1->Lines->Add(AThread->Connection->Binding->PeerIP);

//надіслати локальну IP адресу

AThread->Connection->WriteLn(AThread->Connection->Binding->IP);

}

catch(...)

{//при помилці надіслати "помилка"

AThread->Connection->WriteLn("помилка");

}

AThread->Connection->Disconnect();//роз'єднати з'єднання

}

3 Для можливості роботи програми-сервера на комп’ютері без середовища Borland C++ Builder 6 задайте опції проекту: Project/Options.../Packages/зніміть прапорець Build with runtime packages. На цей комп’ютер також необхідно скопіювати файли: borlndmm.dll і cc3260mt.dll.

4 Скомпілюйте програму-сервер.

5 Помістіть на форму програми-клієнта компоненти TEdit (2 штуки), TButton, TIdTCPClient, і заповніть код:

//конструктор форми

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

Edit1->Text="127.0.0.1";//локальний адрес

}

//обробник події OnClick

void __fastcall TForm1::Button1Click(TObject *Sender)

{

IdTCPClient1->Host=Edit1->Text;//вказати адресу віддаленого комп'ютера

IdTCPClient1->Port=8090;//вказати порт

try

{

IdTCPClient1->Connect();//з'єднати з сервером

IdTCPClient1->WriteLn(Edit2->Text);//надіслати рядок

Edit2->Text = IdTCPClient1->ReadLn();//отримати рядок

}

catch(...)

{//при помилці вивести повідомлення

ShowMessage("Помилка з'єднання");

}

IdTCPClient1->Disconnect();//роз'єднати з'єднання

}

6 Скомпілюйте програму-клієнт.

7 Скопіюйте програму-сервер та файли borlndmm.dll і cc3260mt.dll на віддалений комп’ютер з адресою, наприклад, 192.168.1.5. Виконайте програму-сервер на віддаленій машині і програму клієнт на локальній. Введіть в Edit1 клієнта адресу віддаленого комп’ютера і передайте йому будь-який текст. Для тестування програм без мережі на локальній машині слід вводити адресу 127.0.0.1.

Лабораторна робота 9 Тема: Безпека даних в ос

Завдання:

1.Дослідити роботу програми.

2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.

3.За завданням викладача розробити власний проект на основі існуючого. Додання елементів в список вибіркового керування доступом (dacl) файла або каталога

#ifndef UNICODE

#define UNICODE

#endif

#include <windows.h>

#include <stdio.h>

#include <lm.h>

int main()

{

wchar_t wchDirName[248]; // имя каталога

wchar_t wchUserName[UNLEN]; // имя пользователя

ACL *lpOldDacl; // указатель на старый DACL

ACL *lpNewDacl; // указатель на новый DACL

LPVOID lpAce; // указатель на элемент ACE

DWORD dwDaclLength = 0; // длина DACL

DWORD dwSdLength = 0; // длина SD

DWORD dwSidLength = 0; // длина SID

DWORD dwLengthOfDomainName = 0; // длина имени домена

PSID lpSid = NULL; // указатель на разрешающий SID

LPTSTR lpDomainName = NULL; // указатель на имя домена

SID_NAME_USE typeOfSid; // тип учетной записи

SECURITY_DESCRIPTOR *lpSd = NULL; // адрес дескриптора безопасности

SECURITY_DESCRIPTOR sdAbsoluteSd; // абсолютный формат SD

BOOL bDaclPresent; // признак присутствия списка DACL

BOOL bDaclDefaulted; // признак списка DACL по умолчанию

DWORD dwRetCode; // код возврата

// читаем имя файла или каталога

printf("Input a file or directory name: ");

_getws(wchDirName);

// получаем длину дескриптора безопасности

if (!GetFileSecurity(

wchDirName, // имя файла

DACL_SECURITY_INFORMATION, // получаем DACL

lpSd, // адрес дескриптора безопасности

0, // определяем длину буфера

&dwSdLength)) // адрес для требуемой длины

{

dwRetCode = GetLastError();

if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)

// распределяем память для буфера

lpSd = (SECURITY_DESCRIPTOR*) new char[dwSdLength];

else

{

// выходим из программы

printf("Get file security failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

}

// читаем дескриптор безопасности

if (!GetFileSecurity(

wchDirName, // имя файла

DACL_SECURITY_INFORMATION, // получаем DACL

lpSd, // адрес дескриптора безопасности

dwSdLength, // длину буфера

&dwSdLength)) // адрес для требуемой длины

{

dwRetCode = GetLastError();

printf("Get file security failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// вводим имя пользователя, которого добавляем в DACL

printf("Input a user name: ");

_getws(wchUserName);

// определяем длину SID пользователя

if (!LookupAccountName(

NULL, // ищем имя на локальном компьютере

wchUserName, // имя пользователя

NULL, // определяем длину SID

&dwSidLength, // длина SID

NULL, // определяем имя домена

&dwLengthOfDomainName, // длина имени домена

&typeOfSid)) // тип учетной записи

{

dwRetCode = GetLastError();

if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)

{

// распределяем память для SID

lpSid = (SID*) new char[dwSidLength];

lpDomainName = (LPTSTR) new wchar_t[dwLengthOfDomainName];

}

else

{

// выходим из программы

printf("Lookup account name failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

}

// определяем SID

if(!LookupAccountName(

NULL, // ищем имя на локальном компьютере

wchUserName, // имя пользователя

lpSid, // указатель на SID

&dwSidLength, // длина SID

lpDomainName, // указатель на имя домена

&dwLengthOfDomainName, // длина имени домена

&typeOfSid)) // тип учетной записи

{

dwRetCode = GetLastError();

printf("Lookup account name failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// получаем список DACL из дескриптора безопасности

if (!GetSecurityDescriptorDacl(

lpSd, // адрес дескриптора безопасности

&bDaclPresent, // признак присутствия списка DACL

&lpOldDacl, // адрес указателя на DACL

&bDaclDefaulted)) // признак списка DACL по умолчанию

{

dwRetCode = GetLastError();

printf("Get security descriptor DACL failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// определяем длину нового DACL

dwDaclLength = lpOldDacl->AclSize +

sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + dwSidLength;

// распределяем память под новый DACL

lpNewDacl = (ACL*)new char[dwDaclLength];

// инициализируем новый DACL

if (!InitializeAcl(

lpNewDacl, // адрес DACL

dwDaclLength, // длина DACL

ACL_REVISION)) // версия DACL

{

dwRetCode = GetLastError();

printf("Lookup account name failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// добавляем нового элемент в новый DACL

if (!AddAccessDeniedAce(

lpNewDacl, // адрес DACL

ACL_REVISION, // версия DACL

FILE_WRITE_ATTRIBUTES, // запрещаем писать атрибуты

lpSid)) // адрес SID

{

dwRetCode = GetLastError();

perror("Add access allowed ace failed.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

// получаем адрес первого ACE в старом списке DACL

if (!GetAce(

lpOldDacl, // адрес старого DACL

0, // ищем первый элемент

&lpAce)) // адрес первого элемента

{

dwRetCode = GetLastError();

printf("Get ace failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// переписываем элементы из старого DACL в новый DACL

if (bDaclPresent)

{

if (!AddAce(

lpNewDacl, // адрес нового DACL

ACL_REVISION, // версия DACL

MAXDWORD, // добавляем в конец списка

lpAce, // адрес старого DACL

lpOldDacl->AclSize - sizeof(ACL))) // длина старого DACL

{

dwRetCode = GetLastError();

perror("Add access allowed ace failed.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

}

// проверяем достоверность DACL

if (!IsValidAcl(lpNewDacl))

{

dwRetCode = GetLastError();

perror("The new ACL is invalid.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

// создаем новый дескриптор безопасности в абсолютной форме

if (!InitializeSecurityDescriptor(

&sdAbsoluteSd, // адрес структуры SD

SECURITY_DESCRIPTOR_REVISION))

{

dwRetCode = GetLastError();

perror("Initialize security descriptor failed.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

// устанавливаем DACL в новый дескриптор безопасности

if (!SetSecurityDescriptorDacl(

&sdAbsoluteSd, // адрес дескриптора безопасности

TRUE, // DACL присутствует

lpNewDacl, // указатель на DACL

FALSE)) // DACL не задан по умолчанию

{

dwRetCode = GetLastError();

perror("Set security descriptor DACL failed.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

// проверяем структуру дескриптора безопасности

if (!IsValidSecurityDescriptor(&sdAbsoluteSd))

{

dwRetCode = GetLastError();

perror("Security descriptor is invalid.\n");

printf("The last error code: %u\n", dwRetCode);

return dwRetCode;

}

// устанавливаем новый дескриптор безопасности

if (!SetFileSecurity(

wchDirName, // имя файла

DACL_SECURITY_INFORMATION, // устанавливаем DACL

&sdAbsoluteSd)) // адрес дескриптора безопасности

{

dwRetCode = GetLastError();

printf("Set file security failed.\n");

printf("Error code: %d\n", dwRetCode);

return dwRetCode;

}

// освобождаем память

delete[] lpSd;

delete[] lpSid;

delete[] lpDomainName;

delete[] lpNewDacl;

return 0;

}