от
Я ищу способ, чтобы получить все пользовательские Морс в системе с помощью API-интерфейса Windows. Получение всех идентификаторов пользователей может быть сделано с помощью
wmic useraccount get sid
. Есть ли способ получить эту информацию через Windows вместо интерфейса API? Кроме того, команда
wmic
возвращает идентификаторы всех учетных записей, включая учетные записи с ограниченными возможностями -
wmic useraccount get disabled,sid
покажет, какие учетные записи будут отключены. Это будет бонус, если решение может посоветовать, как получить идентификаторы учетных записей, которые не являются инвалидами, но это не важно.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

3 Ответы

0 голосов
от
Вы можете воспользоваться функцией:
NET_API_STATUS NET_API_FUNCTION NetUserEnum(
  LPCWSTR servername,
  DWORD   level,
  DWORD   filter,
  LPBYTE  *bufptr,
  DWORD   prefmaxlen,
  LPDWORD entriesread,
  LPDWORD totalentries,
  PDWORD  resume_handle
);
с
servername = NULL
перечислить учетные записи локального компьютера, а затем использовать:
BOOL LookupAccountNameW(
  LPCWSTR       lpSystemName,
  LPCWSTR       lpAccountName,
  PSID          Sid,
  LPDWORD       cbSid,
  LPWSTR        ReferencedDomainName,
  LPDWORD       cchReferencedDomainName,
  PSID_NAME_USE peUse
);
для получения Сида. См https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netuserenum и https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lookupaccountnamew дополнительные сведения и примеры. В
NetUserEnum
функции, настройка
level=1
параметр вернется подробная информация об учетных записях пользователей, а параметр
bufptr
будет указывать на массив
USER_INFO_1
структур. Исследовав
usri1_flags
член структуры
USER_INFO_1
с
UF_ACCOUNTDISABLE
маска придать статус учетной записи. После RbMm комментарий, обратите внимание, что при указании в функции
NetUserEnum
в
level=3
параметр, параметр
bufptr
будет указывать на массив
USER_INFO_3
структур, что содержит избавление пользователя. В
usri3_user_id
члена содержит относительный идентификатор (rid) пользователя, и член
usri3_primary_group_id
содержит от основной глобальной группы пользователей. Используя эти значения вам не нужно звонить
LookupAccountNameW
. Эффективность повышается с использованием предложения от RbMm в комментариях ниже.
0 голосов
от
Есть несколько способов. Простой один с NetQueryDisplayInformation Образец теста (для Windows 10, С. 2015) =>
NET_API_STATUS NetStatus;
DWORD dwIndex = 0;
DWORD dwEntriesRequested = 0xFFFFFFFF;
DWORD dwPreferredMaximumLength = 0xFFFFFFFF;
DWORD dwReturnedEntryCount;
PVOID pNDU = NULL;
do {
    NetStatus = NetQueryDisplayInformation(NULL, 1, dwIndex, dwEntriesRequested, dwPreferredMaximumLength,
0 голосов
от
для перечисления учетных записей в Sam (диспетчер учетных записей безопасности) базы данных мы можем использовать или
NetQueryDisplayInformation
(более быстрый) или
NetUserEnum
(если нужно больше подробной информации пользователей). или Сэм API-интерфейс (быстрый, включают ntsam.H и ссылки с samlib.Либ ) обратите внимание, что если у нас есть пользователь (МПОГ) нам не нужно использовать метод lookupaccountname - это очень не эффективно в этом случае (много тяжелых удаленные вызовы внутренние -
LsaOpenPolicy
,
LsaLookupNames2
,
LsaClose
. внутреннего использования
LsaLookupNames2
в любом случае сам по API
SamLookupNamesInDomain
). на самом деле все, что нам нужно - сначала получить домен Sid и чем Добавить пользователя удалить его. получить Sid домена можно по
LsaQueryInformationPolicy
с
PolicyAccountDomainInformation
для Sid доменной учетной записи (компьютер) - всегда будет существовать и с
PolicyDnsDomainInformation
или
PolicyPrimaryDomainInformation
для Сида основного домена (существовать, только если компьютер входит в домен)
void PrintUsersInDomain(PUNICODE_STRING ServerName, PSID DomainSid)
{
    PWSTR szServerName = 0;

    if (ServerName)
    {
        if (ULONG Length = ServerName
...