Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как получить название группы Администраторов в переменную. (http://forum.oszone.net/showthread.php?t=136097)

volk1234 28-03-2009 11:14 1077021

Как получить название группы Администраторов в переменную.
 
Написал себе простейший скрипт для рабочих групп-
создает Учетную запись администратора с паролем.

net user USER PASS /add
и так далее.

Проблемма в том, что иногда попадается англицкая винда и группа называется Administrators, а не Администраторы.
Я сделал простейший выбор через set /p, 1-ENG 2-RUS.
Есть ли способ получить в переменную название группы Администраторы.

Petya V4sechkin 28-03-2009 12:49 1077074

volk1234, а есть ли смысл?
Можно просто обе команды выполнить:
Код:

net localgroup Администраторы /add USER
net localgroup Administrators /add USER

и не напрягаться с выяснением.

Цитата:

Цитата volk1234
Есть ли способ получить в переменную название группы Администраторы.

Встроенная группа Администраторы всегда имеет SID = S-1-5-32-544 (KB243330), получить имя по SID можно командой:
Код:

WMIC Group Where "SID = 'S-1-5-32-544'" Get Name
или с помощью PsGetSid.

Пример:
Код:

Set AdmGroupSID=S-1-5-32-544
Set AdmGroup=
ChCP 1251 >nul
For /F "Tokens=1* Delims=: " %%I In ('PsGetSid %AdmGroupSID% 2^>nul ^| Find /I "Alias:"') Do Set AdmGroup=%%J
ChCP 866 >nul
Set AdmGroup=%AdmGroup:~8%

или так:
Код:

Set AdmGroupSID=S-1-5-32-544
Set AdmGroup=
For /F "UseBackQ Tokens=1* Delims==" %%I In (`WMIC Group Where "SID = '%AdmGroupSID%'" Get Name /Value ^| Find "="`) Do Set AdmGroup=%%J
Set AdmGroup=%AdmGroup:~0,-1%

В переменной AdmGroup имя группы.

volk1234 28-03-2009 16:39 1077225

Мда. Все не так страшно как выглядит в коде :)

Цитата:

volk1234, а есть ли смысл?
ну хотябы, чтобы не копатся выясняя - а не переименована ли группа Администраторы ...
Плюс, автоматически можно переименовать локальную учетку Администратор, и понизить ее до Пользователя.
Есть несколько организаций по 10 комп. в каждой, с обыной рабочей группой и зверинцем из программ на каждом рабочем месте.
Надо все это почистить, вот планирую ...

Petya V4sechkin 29-03-2009 09:31 1077737

Цитата:

Цитата volk1234
Плюс, автоматически можно переименовать локальную учетку Администратор

Тут запрос немного другой: у встроенного админа RID = 500 (окончание SID), поэтому:
Код:

Set AdmAccountRID=500
Set NewAdmin=Adminn
WMIC UserAccount Where "LocalAccount = True And SID Like 'S-1-5-%%-%AdmAccountRID%'" Call Rename Name = "%NewAdmin%"


volk1234 05-04-2009 02:14 1084458

Многоуважаемый Petya V4sechkin!

Остался у меня последний вопрос. Как получить в переменную и понизить в правах УЗ Администратор
то есть в итоге

Код:

net  localgroup %AdmGroup% %AdmName% /delete
 net  localgroup %UserGroup% %AdmName% /add
*все переменные надо получать


чесно пытался почитать справку по коммандной строке wmic - страшное дело :)

еще конечно хотелось бы следующего:
определения всех УЗ с правами администратора.
ситуация самая обычная - компьютер на нем установлена WinXP с 2 УЗ: Администратор и Коля (с правами админа)
Необходимо это исправить, так как домена нету - исправить ручками или атоматизированно:
Админ запись Коля понизить до пользователя, Администратора понизить до пользователя. и так далее если админов больше....

Petya V4sechkin 05-04-2009 12:03 1084606

Цитата:

Цитата volk1234
Как получить в переменную

Вы же переименовали админа, поэтому должны знать новое имя (в 4-м посту переменная NewAdmin).

Цитата:

Цитата volk1234
понизить в правах УЗ Администратор

Зачем? Не надо этого делать.
Просто задайте нормальный пароль.

Цитата:

Цитата volk1234
Админ запись Коля понизить до пользователя, Администратора понизить до пользователя. и так далее если админов больше

Если переменная AdmGroup вычислена, а админ переименован (переменная NewAdmin), то список членов группы Администраторы (за исключением встроенного):
Код:

For /F "Delims=" %%I In ('Net LocalGroup "%AdmGroup%"') Do Set Last=%%I
For /F "Skip=6 Delims=" %%I In ('Net LocalGroup "%AdmGroup%"') Do (
  If "%%I" Neq "%Last%" (
    If "%%I" Neq "%NewAdmin%" (
      Echo %%I
    )
  )
)

Вместо команды Echo %%I подставить желаемое (добавление в группу, удаление из группы).

P. S. Завтра еще проверю формат вывода Net LocalGroup на разных ОС.

volk1234 05-04-2009 13:28 1084660

Как раз таки результат и встроенного админа выдает.

читать дальше »
Код:

Echo off
Set AdmGroupSID=S-1-5-32-544
Set AdmGroup=

For /F "UseBackQ Tokens=1* Delims==" %%I In (`WMIC Group Where "SID = '%AdmGroupSID%'" Get Name /Value ^| Find "="`) Do Set AdmGroup=%%J
Set AdmGroup=%AdmGroup:~0,-1%

For /F "Delims=" %%I In ('Net localgroup "%AdmGroup%"') Do Set Last=%%I
For /F "Skip=6 Delims=" %%I In ('Net LocalGroup "%AdmGroup%"') Do (
  If "%%I" Neq "%Last%" (
    If "%%I" Neq "%NewAdmin%" (
      Echo %%I
    )
  )
)
pause



Я тут псевдокодом напишу дальнейшее применение:


тоесть если я дальше применю вместо Echo %%I
Код:

......
...Set %admname(счетчик)%=%%I
        )
  )
)

Код:

For (
net localgroup %UserGroup%  %admname(счетчик)% /add
net localgroup %AdmGroup%  %admname(счетчик)% /delete
)


Petya V4sechkin 05-04-2009 13:37 1084666

Цитата:

Цитата volk1234
Как раз таки результат и встроенного админа выдает. »

В вашем батнике не определена переменная NewAdmin.
И нет переименования:
Цитата:

Цитата volk1234
автоматически можно переименовать локальную учетку Администратор »

Цитата:

Цитата volk1234
Set %admname(счетчик)%=%%I »

А это зачем?

volk1234 05-04-2009 16:41 1084776

с %NewAdmin% разобрался, супер, спасибо.
насчет счетчика -
чтобы переместить все учетки в группу пользователи, если у.з. больше одной,
админ1 > пользователь
админ2 > пользователь
админ3 > пользователь

а встроенную запись администратора по вашему совету, тогда просто запоролим.

Я понимаю, что вы не умеете читать мысли. :)

Petya V4sechkin 05-04-2009 18:35 1084859

Цитата:

Цитата volk1234
чтобы переместить все учетки в группу пользователи

Но зачем для этого создавать кучу переменных?
Код:

Net LocalGroup "%UserGroup%" "%%I" /Add
Net LocalGroup "%AdmGroup%" "%%I" /Delete

С переменной UserGroup разобрались? По аналогии с AdmGroup.

P. S. После этого не забудьте создать вашу новую учетку и добавить ее в Администраторы.

volk1234 06-04-2009 00:17 1085145

UserGroup допер сам сразу. :) RID -545
просто это будет case- скрипт - когда надо полностью ограничить юзверя -так и сделаем.
А бывают клиенты - сидит начальник отдела щеки дует - у.з. у него одна Администратор ( себя он считает как минимум продвинутым пользователем) и ничего менять он не намерен, и если не дай бог завтра у него пасьянс откажется устанавливатся- лучше мне выбрасить мобилу сразу. Тут лучше свою вторую учетку добавить.

volk1234 24-04-2009 03:24 1102605

Уважаемый Petya V4sechkin !

Подскажите пожалуйста еще: почему у меня не сработала команда:

Код:

:LISTADM
For /F "UseBackQ Tokens=1* Delims==" %%I In (`WMIC Group Where " SID = '%AdmGroupSID%' " Get Name /Value ^| Find "="`) Do Set AdmGroup=%%J
Set AdmGroup=%AdmGroup:~0,-1%
Echo Группа Администраторов на этом компьютере - '%AdmGroup%'
pause

For /F "Delims=" %%I In ('Net LocalGroup "%AdmGroup%"') Do Set Last=%%I
For /F "Skip=6 Delims=" %%I In ('Net LocalGroup "%AdmGroup%"') Do (
  If "%%I" Neq "%Last%" (
      Echo %%I
    )
  )
 


WMIC Group Where "SID = 'S-1-5-32-500'" Do Set Name='%AdmiGroup%'
Echo Встроеный админ %AdmiName%


pause

GOTO :EOF

Цель была распечатать список группы и ее членов с отдельной распечаткой встроенного админа.

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

Petya V4sechkin 24-04-2009 09:44 1102706

Цитата:

Цитата volk1234
WMIC Group Where "SID = 'S-1-5-32-500'" Do Set Name='%AdmiGroup%'
Echo Встроеный админ %AdmiName%

И что это означает?
С тем же успехом можно написать случайную последовательность букв и надеяться, что она заработает...

Сначала вы хотели переименовать встроенную учетку Администратор. В 4-м посту я привел пример. Если вы переименовываете админа, то знаете новое имя (каким оно станет).

Теперь уже вы не хотите ее переименовывать, а просто выводите на экран.
Пожалуйста:
Код:

Set AdmAccountRID=500
Set AdmAcc=
For /F "UseBackQ Tokens=1* Delims==" %%I In (`WMIC UserAccount Where "LocalAccount = True And SID Like 'S-1-5-%%-%AdmAccountRID%'" Get Name /Value ^| Find "="`) Do Set AdmAcc=%%J
Set AdmAcc=%AdmAcc:~0,-1%

Echo Встроеный админ: %AdmAcc%


volk1234 24-04-2009 16:14 1103090

Petya V4sechkin
Во первых спасибо за помощь.

Во вторых, то что вы приводили не пошло "в стол", просто я задумал расширить функционал скрипта и ввести для удобства вывод груп и пользователей в консоли -
эдакая замена консоли mmc. Может я и изобретаю велосипед и это (вывод всех груп и всех пользователей по группам) можно сделать 1й коммандой, но мне стало интересно это сделать.

Правда я упорно не могу найти справки по wmic, а нахрапом логику я не могу понять.
Вот приведенный вами пример в предыдущем посте. Я копирую ваш скрипт меняю RID на 545
и выдается ошибка - отсуствуют экземпляры класса.
И когда применяется SID=1-5-32-500, а когда SID Like '1-5-%%-%env%' ???? :o :cool:

Petya V4sechkin 24-04-2009 18:47 1103247

Цитата:

Цитата volk1234
Правда я упорно не могу найти справки по wmic

Пуск -> Справка и поддержка -> Найти -> WMIC
Там общие сведения о синтаксисе, командах. Например, GET - получение свойств (Properties), CALL - выполнение метода (Method). Что касается списка классов, вот полный перечень на MSDN. Например, псевдоним UserAccount соответствует классу Win32_UserAccount, а Group - Win32_Group.

Еще ссылки:
Доступ к WMI из командной строки. Командная оболочка WMIC
Командная строка инструментария управления Windows (WMIC)

Цитата:

Цитата volk1234
Я копирую ваш скрипт меняю RID на 545

Что такое 545, можете сказать?
Статью KB243330 внимательно читали?
Чувствуете разницу между Group и UserAccount?

Цитата:

Цитата volk1234
И когда применяется SID=1-5-32-500

Не существует такого SID. Еще раз в статью KB243330.
Цитата:

Цитата KB243330
  • SID: S-1-5-домен-500
    Название: Администратор

Это учетная запись, UserAccount.
Курсивом выделенное домен - это буквы/цифры из SID домена или компьютера (уникальные для каждого компьютера). Значит, для получения имени встроенной учетки Администратор достаточно найти такой UserAccount, у которого SID = S-1-5-любая_последовательность_символов-500. В языке запросов SQL (или WQL) это делается оператором LIKE (любая последовательность задается спецсимволом "%" (процент)) в условии WHERE:
Код:

LocalAccount = True And SID Like 'S-1-5-%-500'
LocalAccount нужно, если комп в домене (чтобы выбиралась только локальная учетка). Примем во внимание, что в батнике символ "%" также является специальным, для его экранирования нужно продублировать: %%.
Надеюсь, теперь вам понятно, как формируется условие WHERE в 13-м посту?

Цитата:

Цитата KB243330
  • SID: S-1-5-32-545
    Название: Пользователи

Это группа, Group.
Никаких уникальных букв/цифр здесь нет. Значит, условие поиска упрощается (LIKE не нужен).

P. S. Надеюсь, что все понятно (еще раз такие полотна писать не хочется).
P. P. S. Для иллюстрации вышесказанного выполните батник (и сравните команды):
Код:

@Echo Off

WMIC Group Where "LocalAccount = True And SID = 'S-1-5-32-545'" Get Name, SID /Value
WMIC UserAccount Where "LocalAccount = True And SID Like 'S-1-5-%%-500'" Get Name, SID /Value

Pause


volk1234 24-04-2009 22:27 1103410

:tomato2:

volk1234 31-07-2009 02:33 1182091

Petya V4sechkin
восставшие из ада :)

Нашел интересное применение этой темы.
Например для защиты от Кидо необходимо запретить доступ к определенной ветке реестра для группы "Все".
Я использовал батник и утилиту subinacl.exe.
SID группы "Все" = S-1-1-0
Взяв за основу ваш скрипт я почему-то не получил названия группы в переменную, а получил пресловутое - отсуствуют экземпляры класса.
Для проверки скрипта я подставил вместо SID группы "Все", такой S-1-5-32-544 и получил "Администраторы".

батник:

Код:

@Echo off
Set UG=""
Set UGSid=S-1-1-0

 
For /F "UseBackQ Tokens=1* Delims==" %%I In (`WMIC Group Where "SID = '%UGSid%'" Get Name /Value ^| Find "="`) Do Set UG=%%J
Set UG=%UG:~0,-1%

Echo %UG%
pause


Petya V4sechkin 31-07-2009 10:58 1182239

volk1234, да, Win32_Group не содержит группу Все (и не только).
Полный список:
Код:

WMIC Group Where "LocalAccount = True" Get Name, SID
Тогда можно PsGetSid поковырять (пример я уже приводил, кажется).
Код:

@Echo Off

Reg Add HKCU\Software\Sysinternals\PsGetSid /V EulaAccepted /T REG_DWORD /D 1 /F >nul
ChCP 1251 >nul
For /F "Skip=1 Tokens=2 Delims=\" %%I In ('PsGetSid.exe S-1-1-0 2^>nul') Do Set Everyone=%%I
ChCP 866 >nul
Echo %Everyone%

Pause

Тут проблема с кодировкой. На русских и английских системах работает (проверял на XP, 2003, Vista, 7).

volk1234 31-07-2009 18:01 1182571

Ну это уже черезчур.
Легче и правда тупо писать в двух наименованиях УЗ определить язык ОС да и все.
Я так в одном скрипте и сделал:
читать дальше »

Код:

Set UG=""
Set LANG=""
Set OsName=""
 
:OS_DETECT
For /F "Skip=4 Tokens=3" %%A In ('Reg Query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language" /V InstallLanguage') Do Set OSLang=%%A

If %OSLang%==0419 Set LANG=RUS
If %OSLang%==0409 Set LANG=ENU
If %OSLang%==0419 Set UG=‚бҐ
If %OSLang%==0409 Set UG=Everyone

For /F "Skip=4 Tokens=3" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CurrentVersion') Do Set OSver=%%A
If %OSver%==5.1 Set OsName=WindowsXP
If %OSver%==5.2 Set OsName=WindowsServer2003

Set KBFile=%OsName%-KB967715-x86-%LANG%.exe

If Exist "C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\KB967715.cat" (
 Echo KB967715 hot fix Has ALREADY Installed on this system
 Echo Ok..

) Else (
Call :KB_INSTL
)

If %UG%=="" (
Echo UserGroup not Defined because Language of %OSName% unsupported
pause
Goto :EOF
)



Но меня ждала здесь засада - по языку установки ОС -английская, а накатанный на нее MUI портил мне всю картину с именами УЗ...

aboudkar@fb 27-07-2014 02:28 2381752

Такой вот скриптик запущенный 1 раз на системе решит проблемму. (Искал искал не нашёл и налобал сам.)

Код:

__author__ = 'abudkar'

import win32net
import win32security


def main():
    all_groups = [g['name'] for g in win32net.NetLocalGroupEnum('', 0)[0]]
    for group in all_groups:
        sid = str(win32security.LookupAccountName('', group)[0]).replace('PySID:', '')
        standardGroup = StandardGroups.get(sid, '')
        if standardGroup and standardGroup != group:
            info = win32net.NetLocalGroupGetInfo('', group, 0)
            info['name'] = standardGroup
            print('Renaming: `{}` to: `{}`'.format(group, standardGroup).encode('utf-8'))
            win32net.NetLocalGroupSetInfo('', group, 0, info)


#http://support.microsoft.com/kb/243330/en-us
StandardGroups = {
    'S-1-0': 'Null Authority',
    'S-1-0-0': 'Nobody',
    'S-1-1': 'World Authority',
    'S-1-1-0': 'Everyone',
    'S-1-16-0': 'Untrusted Mandatory Level',
    'S-1-16-12288': 'High Mandatory Level',
    'S-1-16-16384': 'System Mandatory Level',
    'S-1-16-20480': 'Protected Process Mandatory Level',
    'S-1-16-28672': 'Secure Process Mandatory Level',
    'S-1-16-4096': 'Low Mandatory Level',
    'S-1-16-8192': 'Medium Mandatory Level',
    'S-1-16-8448': 'Medium Plus Mandatory Level',
    'S-1-2': 'Local Authority',
    'S-1-2-0': 'Local',
    'S-1-2-1': 'Console Logon',
    'S-1-3': 'Creator Authority',
    'S-1-3-0': 'Creator Owner',
    'S-1-3-1': 'Creator Group',
    'S-1-3-2': 'Creator Owner Server',
    'S-1-3-3': 'Creator Group Server',
    'S-1-3-4': 'Owner Rights',
    'S-1-4': 'Non-unique Authority',
    'S-1-5': 'NT Authority',
    'S-1-5-1': 'Dialup',
    'S-1-5-10': 'Principal Self',
    'S-1-5-11': 'Authenticated Users',
    'S-1-5-12': 'Restricted Code',
    'S-1-5-13': 'Terminal Server Users',
    'S-1-5-14': 'Remote Interactive Logon',
    'S-1-5-15': 'This Organization',
    'S-1-5-17': 'This Organization',
    'S-1-5-18': 'Local System',
    'S-1-5-19': 'NT Authority',
    'S-1-5-2': 'Network',
    'S-1-5-20': 'NT Authority',
    'S-1-5-3': 'Batch',
    'S-1-5-32-544': 'Administrators',
    'S-1-5-32-545': 'Users',
    'S-1-5-32-546': 'Guests',
    'S-1-5-32-547': 'Power Users',
    'S-1-5-32-548': 'Account Operators',
    'S-1-5-32-549': 'Server Operators',
    'S-1-5-32-550': 'Print Operators',
    'S-1-5-32-551': 'Backup Operators',
    'S-1-5-32-552': 'Replicators',
    'S-1-5-32-554': 'Pre-Windows 2000 Compatible Access',
    'S-1-5-32-555': 'Remote Desktop Users',
    'S-1-5-32-556': 'Network Configuration Operators',
    'S-1-5-32-557': 'Incoming Forest Trust Builders',
    'S-1-5-32-558': 'Performance Monitor Users',
    'S-1-5-32-559': 'Performance Log Users',
    'S-1-5-32-560': 'Windows Authorization Access Group',
    'S-1-5-32-561': 'Terminal Server License Servers',
    'S-1-5-32-562': 'Distributed COM Users',
    'S-1-5-32-569': 'Cryptographic Operators',
    'S-1-5-32-573': 'Event Log Readers',
    'S-1-5-32-574': 'Certificate Service DCOM Access',
    'S-1-5-32-575': 'RDS Remote Access Servers',
    'S-1-5-32-576': 'RDS Endpoint Servers',
    'S-1-5-32-577': 'RDS Management Servers',
    'S-1-5-32-578': 'Hyper-V Administrators',
    'S-1-5-32-579': 'Access Control Assistance Operators',
    'S-1-5-32-580': 'Remote Management Users',
    'S-1-5-4': 'Interactive',
    'S-1-5-5-X-Y': 'Logon Session',
    'S-1-5-6': 'Service',
    'S-1-5-64-10': 'NTLM Authentication',
    'S-1-5-64-14': 'SChannel Authentication',
    'S-1-5-64-21': 'Digest Authentication',
    'S-1-5-7': 'Anonymous',
    'S-1-5-8': 'Proxy',
    'S-1-5-80': 'NT Service',
    'S-1-5-80-0': 'All Services',
    'S-1-5-9': 'Enterprise Domain Controllers'
}

if __name__ == '__main__':
    main()


etix 02-04-2015 13:02 2490837

Задачу получения имени локальных администраторов еще можно решить так:
Код:

@set AdminName=Administrator
@net user %AdminName% 2>&1
@IF ERRORLEVEL 1 set AdminName=Администратор && chcp 866 >nul
@echo %AdminName%

Использовал на зоопарке русских и английских клиентских машин. См. также сообщение ниже от тов. Iska.

Iska 02-04-2015 13:16 2490848

etix, во-первых, вычеркните слово «группы». Во-вторых, ничто в принципе не мешает иметь одновременно учётные записи «Администратор» и «Administrator» на одной и той же машине (и даже может оказаться так, что ни одна из них не будет являться встроенной учётной административной записью).

Foreigner 02-04-2015 14:18 2490893

Задачу получения имени группы локальных администраторов лучше получить так:
Код:

@echo off
setlocal

set "wmic=wmic group where sid="S-1-5-32-544" get name /value"
for /f %%i in (' "%wmic%" ') do 1>nul set "%%i"

echo %name%


Iska 02-04-2015 15:31 2490963

Foreigner, «их есть» во втором сообщении темы. Это новоявленные (и не очень) коллеги отчего-то возбуждаются.

Foreigner 02-04-2015 15:48 2490971

Iska, Не посмотрел в начале, пусть будет напоминанием


Время: 15:16.

Время: 15:16.
© OSzone.net 2001-