Но для 9х это не проходит. Есть ли какой нибудь универсальный способ или надо для каждого «типа» операционки писать свою процедуру?
The GetComputerName function retrieves the computer name of the current system. This name is established at system startup, when it is initialized from the registry.
LPTSTR lpBuffer,// address of name buffer LPDWORD nSize // address of size of name buffer );
The GetUserName function retrieves the user name of the current thread. This is the name of the user currently logged onto the system.
LPTSTR lpBuffer,// address of name buffer LPDWORD nSize // address of size of name buffer );
Например :
function GetCompName: String; var Buffer: array[0..Pred(MAX_COMPUTERNAME_LENGTH+1)] of Char; Size: cardinal; begin Size := SizeOf(Buffer); Windows.GetComputerName(Buffer, Size); Result := Buffer; end;
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Функции то эти (GetComputerName и GetUserName) раздельно работают замечательно, но при использовании вместе срабатывает только первая. почему — так и не понял. А еще к этому вопросу — где-то я не так давно на каком-то форуме видел использование какой-то системной функции, которая возвращает полное имя компьютера (вместе с доменом). Не записал тогда — и теперь очень жалею. Использовать реестр нельзя — с программой будут работать обычные пользователи, которые не будут иметь к нему доступа. И использовать разные навороченные способы тоже не хочу — программа должна быть как можно меньше (компрессоры тут не причем), поэтому подключать разные модули и писать (а сначала разбираться) самому функции не хочу — ведь есть простой способ — тот самый! Может кто его знает? А может еще кто знает почему вышеупомянутые функции не работают (точнее работают но частично) вместе?
Всего записей: 1 | Зарегистр. 21-09-2011 | Отправлено:10:15 21-09-2011
rrromano
Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Описание: function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL;
Функция возвращает имя NetBIOS локального компьютера. Это имя устанавливается ппри запуске системы и читается из реестра. Если локальный компьютер является узлом(нодой) в кластере(группе), то возвращается имя виртуального сервера кластера. Win 2000/XP: GetComputerName возвращает только имя NetBIOS локального компьютера. Для того, чтобы получить имя хоста DNS, имя домена DNS или полное подтвержденное имя DNS, вызовите функцию GetComputerNameEx. Для получения дополнительной информации см. интерфейс IADsADSystemInfo.
Параметры: lpBuffer: Буфер строки который плучает имя компьютера или имя сервера кластера. Размер буфера должен быть равен MAX_COMPUTERNAME_LENGTH + 1 символов.
nSize: Определяет размер буфера, в символах. Если размера буфера не хватает, то функция терпит неудачу и в GetLastError возвращает ERROR_MORE_DATA. Параметр определяет размер буфера, не включая завершающий нулевой символ. Win 95\98\Me: GetComputerName терпит неудачу если размер буфера мене чем MAX_COMPUTERNAME_LENGTH + 1.
Возвращаемые значения Если функция добивается успеха, то возвращаемое значения True. Если функция терпит неудачу, то False. Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError.
Замечания Функция возвращает имя NetBIOS установленное при запуске системы, поэтому изменения имени функциями SetComputerName или SetComputerNameEx вступают в силу только после перезапуска системы(компьютера).
Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено:10:38 21-09-2011
А еще к этому вопросу — где-то я не так давно на каком-то форуме видел использование какой-то системной функции, которая возвращает полное имя компьютера (вместе с доменом). Не записал тогда — и теперь очень жалею.
Получить FQDN имя компа позволяет GetComputerNameEx.
Что касается одновременной работы GetComputerName(Ex) и GetUserName, то надо внимательнее быть: каждая из функций после своего выполнения возвращает через параметр nSize длину записаной строки в буфер при успешном вызове и необходимую длину буфера при неудачном вызове. Т.к. имя пользователя видимо короче имени компа, то и не проходит второй вызов.
Данная статья была написана взамен исходному коду программы Alien Comp Info, которую вы можете скачать с моего сайта ]]> http://www.CrashX2007.narod.ru ]]> , раздел «Проекты». В этой статье будут описаны некоторые функции и приемы, позволяющие вытянуть необходимую нам информацию о компьютере, его ПО, периферии и так далее. Надеюсь, это будет полезнее, нежели просто предоставление исходного кода с минимумом комментариев или вообще без них (комментов). В общем, читайте и высказывайте свое мнение по этому поводу. Ладно, хватит отступлений, перейдем непосредственно к делу.
Построим данную статью следующим образом: 1. Узнаем имя пользователя и компьютера 2. Информация о BIOS 3. Информация о центральном процессоре 4. Тип ПК 5. Получаем системные директории 6. Информация об ОС 7. Собираем инфу о принтерах 8. Информация о видеосистеме 9. Разбираемся с памятью 10. Мучаем сеть 11. Исследуем диски 12. Заключение
1. Узнаем имя пользователя и компьютера
Итак, первое, с чем мы разберемся, — это получение имени компьютера и имени пользователя. Всем известно, что к цели можно идти разными путями как, например, при решении различных задач в математике, доказательстве теорем и тому подобное. Но у нас программирование, поэтому будем рассматривать все здесь, в этой сфере (по возможности будем рассматривать различные способы решения задач).
Мне известны 3-и способа узнать имя пользователя и ПК:
Использование системного реестра Windows
Необходимую информацию можно посмотреть в следующих ключах: HKEY_CURRENT_USER/Volatile Environment ключи USERNAME – имя пользователя и USERDOMAIN – имя ПК.
Однако в зависимости от системы (WinXP, 2000, Vista и др.) эти ключи могут отсутствовать. Выше приведенные ключи относятся к Vist’e. Для WinXP можно использовать следующие: для имени ПК – LOGONSERVER, а для имени пользователя HOMEPATH или USERPROFILE, но тут тебе придется вычислять имя пользователя (вытаскивать его из строки). Небольшой пример можно посмотреть в листинге номер 1.
Возможно, есть и другие ключи в реестре, через которые можно узнать необходимую нам информацию. Можешь сам посмотреть, открыв реестр, а мы переходим к следующему способу.
Использование сетевых функций
Если ты когда–нибудь занимался программированием сокетов, то наверняка встречал такие функции как GetHostName и GetHostByAddr (кстати, данная функция присутствует также в PHP при программировании сокетов или, как говорят, сетевом программировании). Функция GetHostName в качестве параметров принимает имя буфера, в который будет записано имя ПК и размер буфера. Функцию GetHostByAddr пока оставим в покое (если кому интересно, можете почитать мануалы по программированию сокетов). Так, это были функции позволяющие узнать имя ПК. А как же имя пользователя? Если честно, то «прямых» функций, позволяющих узнать имя пользователя, я не встречал. Конечно, это не означает, что нет никакого способа узнать это, просто надо немного повозиться и сляпать свой алгоритм. Примеров приводить не будем, так как простой код будет мало понятен (пришлось бы отойти в сторону и рассказать немного о программировании сокетов, может в другой раз). Вместо этого переходим к заключительному способу.
Использование WinAPI функций GetComputerName и GetUserName
Данные функции предназначены для получения имени компьютера и имени пользователя соответственно. Они принимают по 2-а параметра: буфер и размер буфера. В результате в буфере мы получаем имя компьютера или пользователя (в зависимости от использованной функции). Пример использования функций приведен в листинге 2.
В примерах мы объявили переменную buf как массив символов длинной от 0 до MAX_COMPUTERNAME_LENGTH (константа равная 15, объявлена в модуле Windows), т.е. размером в 16 символов и размер буфера sizebuf типа dword (тоже 16). В качестве дополнения упомяну функцию SetComputerName, которая служит для установки имени компьютера. В качестве параметра принимает новое имя компьютера.
2. Информация о BIOS
После того как мы узнали какими способами можно получить имя компьютера и имя пользователя, приступим к следующей части нашей поисковой работы, а именно к BIOS. Узнать информацию о BIOS можно 2-мя способами (не забывайте, я говорю о тех способах, которые сам знаю)
1. Использовать Assembler (этот способ сразу отпадает, мы пишем статью о Delphi, может в другой раз) 2. Второй способ распадается на 2-ва, это связано с ОС. Итак, в Win 9x необходимую информацию можно узнать по фиксированному адресу в памяти $FFFF5.
Например: infoBIOS: array[0..7] of char absolute $FFFF5; Хочу заметить, что по фиксированным адресам можно узнать не только информацию о BIOS’e, но и о типе ПК, видео адаптере и другой аппаратуре). В WinXP, 2000, Vista информацию о BIOS’e можно узнать в реестре (жаль, но в NT системах мы не сможем получить прямой доступ к адресам, которые нам необходимы).
Итак данные берем здесь: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System (в Vista есть еще ветка BIOS, там вся необходимая информация). Ключи VideoBiosDate – дата видео БИОС, SystemBiosDate – системная дата БИОС, SystemBiosVersion – версия БИОС. Небольшой пример приведен в листинге номер 3.
Еще одна функция для считывания мультистрок из реестра (она не моя, я использовал уже готовый прототип) приведена в листинге 4.
3. Информация о центральном процессоре
Далее будем пытать процессор. Посмотрим, что он нам скажет. Первый способ определения информации о процессоре (количество процессоров, сопроцессор, SSE, MMX, тип процессора и тд.) — это использование ассемблера, но нам он, как мы уже говорили, не подходит (не в этой статье). Второй способ — использование системного реестра Windows. Вот ветка: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor (дальнейшие разделы – ветки зависят от количества установленных процессоров: 0 — это 1-ый процессор, 1 — это 2-ой процессор и тд.), (да, немного муторно проверять так количество процессоров и информацию по ним). Вот некоторые ключи, из которых можно почерпнуть необходимую нам информацию:
MHz – частота процессора, Identifier – семейство, ProcessorNameString – имя процессора, тип, VendorIdentifier – производитель. Небольшой пример приведён в листинге 5.
Третий способ – это использование Win API функции GetSystemInfo. Эта функция имеет один параметр, переменную типа TSystemInfo (это — структура (запись, говоря на языке Паскаль), производная от _SYSTEM_INFO, описание этой структуры я не буду приводить, если интересно, можешь посмотреть сам (нажми Ctrl и подведи курсор к TSystemInfo, кликни (дальше то же самое с _SYSTEM_INFO))). Итак, функция GetSystemInfo заполняет эту структуру и мы обращаясь затем к ней (структуре) получаем необходимые данные. Пример использования смотри в листинге 6.
Давай теперь попробуем узнать тип ПК. Каким образом мы это можем осуществить? Если у тебя Win 9х (не NT), то узнать необходимые данные не трудно, достаточно обратиться по адресу $FFFFE (если ты знаешь ассемблер, можете использовать его для определения типа ПК). Пример смотри в листинге 7.
В случае WinXP, 2000, Vista нужно использовать реестр, вот ветка: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/SYSTEM, ключ Identifier. Смотри листинг 8.
5. Получаем системные директории
Теперь попробуем найти директорию Windows и системную директорию. Не будем мудрить и рассказывать какие-то лишние и неуместные приемы реализации задуманного. Скажем просто, существует один очень простой и незамысловатый метод – это использование Win API функций. Итак, GetWindowsDirectory возвращает каталог Windows, GetSystemDirectory возвращает системный каталог. Эти 2-е функции принимают 2-а параметра: буфер (в нем и будет находиться необходимая нам информация после выполнения функции) и размер буфера. Пример использования функций находится в листинге 9.
6. Информация об ОС
От директорий к самой ОС. Попробуем узнать тип и версию Windows, для этого воспользуемся API функцией GetVersionEx (есть еще один способ — использование асма ), это — расширенная функция, позволяющая узнать более подробную информацию об ОС. Есть еще одна функция GetVersion, она позволяет узнать версию Windows и DOS. В старшем слове возвращает версию DOS’a, в младшем слове версию Windows). Пример в листинге 10.
Вернемся к функции GetVersionEx, она принимает один параметр – структуру TOSVersionInfo (для этой статьи правильно будет «запись», а не структура, но, в принципе, это — ведь одно и тоже, просто на Паскале принято такие вещи величать записью, а на Си структурами). Опишем эту структуру (запись): DwVersionInfoSize: dword – заполняется перед вызовом функции (размер нашей структуры) DwMajorVersion: dword – старшая цифра версии Windows (3 это WinNT 3.51, 4 это Win98, 95, Me, NT4.0 и 5 это WinXP, 2000, да 6-ка это Vista) DwMinorVersion: dword – младшая цифра версии Windows (0 это Win95, 10 это Win98, 90 это Win Me, 51 WinNT 3.51, 0 это WinNT 4.0, 0 это Win 2000, 1 это WinXP) DwBuildNumber: dword – номер билда DwPlatformId: dword – платформа (VER_PLATFORM_WIN32s – Win3.1, VER_PLATFORM_WIN32 – Win9x, VER_PLATFORM_WIN32_NT – WinNT, 2000) SzCSDVersion:dword – информация о сервис паке. Пример использования функции смотри в листинге 11.
В качестве дополнения к этому пункту можно добавить информацию следующего плана: узнать откуда была установлена Windows – ветка в реестре HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Setup ключ SourcePath и ключ BootDir – загрузочный диск (т.е. диск с которого грузится винда, по умолчанию C:\), а также узнать установлен ли NetFrameWork, и какова его версия можно узнать из реестра по адресу HKEY_LOCAL_MACHINE/Software/Microsoft/.NETFrameWork/Policy.
7. Собираем инфу о принтерах
Всю необходимую информацию можно узнать из реестра: HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Print/Printers ключ DefaultSpoolDirectory – текущая директория спулера. Дальнейшие подветки будут являться «установленными принтерами». Ключи Name – имя принтера, Port – порт принтера, PrinterDriver – драйвер принтера. Второй способ — использование глобального объекта Printer. Пример можно глянуть в листинге 12.
8. Информация о видеосистеме
Посмотрим информацию о видео системе. Некоторые данные, а именно разрешение экрана можно узнать при помощи глобального объекта Screen. Пример в листинге 13.
Остальные данные получим через Win API функцию GetDeviceCaps и контекст драйвера HDC. Давайте рассмотрим все подробнее на примере в листинге 14.
В данном примере я упомянул и разрешение экрана, но это не важно, для нас важно другое — разобраться с GetDeviceCaps. Итак, в разделе переменных мы объявили DC (в нем будет указатель на полученное устройство) типа hDC. Далее при помощи функции CreateDC мы создаем «устройство» (или лучше сказать получаем контекст драйвера устройства), передав в качестве первого параметра DISPLAY (первый параметр — это указатель на драйвер), остальные три параметра мы опускаем, так как они для нас не нужны, заполняем nil’ами. Все, устройство получили, можно с ним работать. Здесь нам поможет как раз функция GetDeviceCaps, в качестве параметров он принимает указатель на устройство (в данном примере DC), и второй параметр — это число (так скажем, обозначающее те данные, которые мы хотим получить от этого устройства). Вместо чисел удобнее использовать символьные константы из модуля Windows, сам можешь посмотреть. Ну вот, в принципе, и все, из примера видно как использовать функцию. И да, по завершению работы удаляйте DC при помощи DeleteDC (см. пример).
9. Разбираемся с памятью
Вот мы и добрались до памяти. В этом пункте посмотрим информацию о физической и виртуальной памяти при помощи Win API функции GlobalMemoryStatus. Функция принимает один параметр – это структура TMemoryStatus. Сейчас давайте рассмотрим пример, а потом все разберем. Смотри листинг 15.
Давай разбираться. В разделе переменных мы объявили нашу структуру (MyMem) и другие вспомогательные переменные, в которые запишем необходимую информацию (количество памяти, свободно, загружено и др.). Далее перед вызовом GlobalMemoryStatus нам необходимо указать размер нашей структуры — dwLength и можно вызывать функцию. Все вызвали, в MyMem все данные которые нам нужны: (описание структуры) DwMemoryLoad – загружено памяти (в процентах) DwTotalPhys – всего оперативной памяти (в байтах) DwAvailPhys – осталось оперативной памяти (в байтах) DwTotalPageFile – всего виртуальной (файл подкачки) памяти (в байтах) DwAvailPageFile – осталось виртуальной памяти (в байтах) Ну, вот в принципе и все. Структуру я описал, остальное из примера видно, что и как. Для редактирования полученных данных использовалась функция Format (так как память то в байтах и ты получишь длинную цепочку циферек (ну в прочем какова оператива, такова и длина этой цепочки ).
В этом пункте рассмотрим подключение к интернету и локальной сети. Каким образом можно определить подключение к сетям (локальным и глобальным)? Ну, тут способов много (естественно все их мы не рассмотрим, только основные). Итак, по порядку. Подключение к интернету:
Первый способ – это использование Indy компонента IdIPWatch c вкладки IndyMisc. Узнать подключен ли компьютер к интернету можно через свойство IsOnline (этого компонента), оно возвращает true если подключен и false в противном случае. А также узнать IP можно через свойство CurrentIP. P.S. Не забудьте установить свойство Active в true. Второй способ – использование функции InetIsOffline из библиотеки URL.dll. Третий способ – использование функции InternetGetConnectedState. Пример в листинге 16.
При проверке подключения к локальной сети используем Win API функцию GetSystemMetrics. Пример в листинге 17.
Все это будет работать (т.е. возвращать true) если установлена сетевая карта и она активна. Еще можно узнать информацию о сетевых картах, для этого надо заглянуть в реестр по адресу: HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/NetworkCards. Так же можно придумать массу своих методов для обнаружения подключений к сети.
11. Исследуем диски
И последнее, что мы рассмотрим в этой статье, – это диски (CD, Hard). Практически всю необходимую информацию можно узнать из Win API функции GetVolumeInformation. Функция принимает много параметров, поэтому рассмотрим все на примере (листинг 18).
Итак, функция принимает первым параметром имя диска (не забудь двоеточие и слеш), вторым параметром – буфер под метку тома, третий параметр – размер этого буфера (буфера метки тома, мы указали MAX_PATH (глобальную константу = не помню, по-моему 260)), четвертый параметр – это серийный номер (указываем соот. переменную), пятый параметр – это максимальная длина имени файла (если не ошибаюсь), шестой параметр – это флаги файловой системы, седьмой параметр – это буфер под имя файловой системы, и последний размер этого буфера. Фуф все. Думаю, из примера вам будет все ясно. Также есть еще функция для определения типа диска GetDriveType, которая принимает в качестве параметра имя диска (например, C:\) и возвращает:
0: если неизвестный диск 1: неверное имя диска DRIVE_REMOVABLE: дискета DRIVE_FIXED: FIXED DRIVE_REMOTE: удаленный диск (сетевой) DRIVE_CDROM: CD ROM DRIVE_RAMDISK: RAM диск
В завершении, наверное, стоит сказать, что это, конечно же, — не все данные (относительно нашего компьютера), которые мы можем получить. Можно еще расширять и раздувать статью по этому поводу вширь и поперек. Поэтому она остается не завершенной. Если ты увидел опечатки, ошибки, неточности или у тебя есть дополнения, пиши мне на почту, все учту.