Показать полную графическую версию : [решено] Как получить название группы Администраторов в переменную.
volk1234
28-03-2009, 11:14
Написал себе простейший скрипт для рабочих групп-
создает Учетную запись администратора с паролем.
net user USER PASS /add
и так далее.
Проблемма в том, что иногда попадается англицкая винда и группа называется Administrators, а не Администраторы.
Я сделал простейший выбор через set /p, 1-ENG 2-RUS.
Есть ли способ получить в переменную название группы Администраторы.
Petya V4sechkin
28-03-2009, 12:49
volk1234, а есть ли смысл?
Можно просто обе команды выполнить:
net localgroup Администраторы /add USER
net localgroup Administrators /add USER
и не напрягаться с выяснением.
Есть ли способ получить в переменную название группы Администраторы.
Встроенная группа Администраторы всегда имеет SID = S-1-5-32-544 (KB243330 (http://support.microsoft.com/kb/243330/ru)), получить имя по SID можно командой:
WMIC Group Where "SID = 'S-1-5-32-544'" Get Name
или с помощью PsGetSid (http://technet.microsoft.com/en-us/sysinternals/bb897417.aspx).
Пример:
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
Мда. Все не так страшно как выглядит в коде :)
volk1234, а есть ли смысл?
ну хотябы, чтобы не копатся выясняя - а не переименована ли группа Администраторы ...
Плюс, автоматически можно переименовать локальную учетку Администратор, и понизить ее до Пользователя.
Есть несколько организаций по 10 комп. в каждой, с обыной рабочей группой и зверинцем из программ на каждом рабочем месте.
Надо все это почистить, вот планирую ...
Petya V4sechkin
29-03-2009, 09:31
Плюс, автоматически можно переименовать локальную учетку Администратор
Тут запрос немного другой: у встроенного админа 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
Многоуважаемый Petya V4sechkin!
Остался у меня последний вопрос. Как получить в переменную и понизить в правах УЗ Администратор
то есть в итоге
net localgroup %AdmGroup% %AdmName% /delete
net localgroup %UserGroup% %AdmName% /add
*все переменные надо получать
чесно пытался почитать справку по коммандной строке wmic - страшное дело :)
еще конечно хотелось бы следующего:
определения всех УЗ с правами администратора.
ситуация самая обычная - компьютер на нем установлена WinXP с 2 УЗ: Администратор и Коля (с правами админа)
Необходимо это исправить, так как домена нету - исправить ручками или атоматизированно:
Админ запись Коля понизить до пользователя, Администратора понизить до пользователя. и так далее если админов больше....
Petya V4sechkin
05-04-2009, 12:03
Как получить в переменную
Вы же переименовали админа, поэтому должны знать новое имя (в 4-м посту переменная NewAdmin).
понизить в правах УЗ Администратор
Зачем? Не надо этого делать.
Просто задайте нормальный пароль.
Админ запись Коля понизить до пользователя, Администратора понизить до пользователя. и так далее если админов больше
Если переменная 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
Как раз таки результат и встроенного админа выдает.
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
Как раз таки результат и встроенного админа выдает. »
В вашем батнике не определена переменная NewAdmin.
И нет переименования:
автоматически можно переименовать локальную учетку Администратор »
Set %admname(счетчик)%=%%I »
А это зачем?
volk1234
05-04-2009, 16:41
с %NewAdmin% разобрался, супер, спасибо.
насчет счетчика -
чтобы переместить все учетки в группу пользователи, если у.з. больше одной,
админ1 > пользователь
админ2 > пользователь
админ3 > пользователь
а встроенную запись администратора по вашему совету, тогда просто запоролим.
Я понимаю, что вы не умеете читать мысли. :)
Petya V4sechkin
05-04-2009, 18:35
чтобы переместить все учетки в группу пользователи
Но зачем для этого создавать кучу переменных?
Net LocalGroup "%UserGroup%" "%%I" /Add
Net LocalGroup "%AdmGroup%" "%%I" /Delete
С переменной UserGroup разобрались? По аналогии с AdmGroup.
P. S. После этого не забудьте создать вашу новую учетку и добавить ее в Администраторы.
volk1234
06-04-2009, 00:17
UserGroup допер сам сразу. :) RID -545
просто это будет case- скрипт - когда надо полностью ограничить юзверя -так и сделаем.
А бывают клиенты - сидит начальник отдела щеки дует - у.з. у него одна Администратор ( себя он считает как минимум продвинутым пользователем) и ничего менять он не намерен, и если не дай бог завтра у него пасьянс откажется устанавливатся- лучше мне выбрасить мобилу сразу. Тут лучше свою вторую учетку добавить.
volk1234
24-04-2009, 03:24
Уважаемый 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
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
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
Правда я упорно не могу найти справки по wmic
Пуск -> Справка и поддержка -> Найти -> WMIC
Там общие сведения о синтаксисе, командах. Например, GET - получение свойств (Properties), CALL - выполнение метода (Method). Что касается списка классов, вот полный перечень на MSDN (http://msdn.microsoft.com/en-us/library/aa394084(VS.85).aspx). Например, псевдоним UserAccount соответствует классу Win32_UserAccount (http://msdn.microsoft.com/en-us/library/aa394507(VS.85).aspx), а Group - Win32_Group (http://msdn.microsoft.com/en-us/library/aa394151(VS.85).aspx).
Еще ссылки:
Доступ к WMI из командной строки. Командная оболочка WMIC (http://www.intuit.ru/department/os/compromtwin/14/)
Командная строка инструментария управления Windows (WMIC) (http://technet.microsoft.com/ru-ru/library/cc784189.aspx)
Я копирую ваш скрипт меняю RID на 545
Что такое 545, можете сказать?
Статью KB243330 (http://support.microsoft.com/kb/243330/ru) внимательно читали?
Чувствуете разницу между Group и UserAccount?
И когда применяется SID=1-5-32-500
Не существует такого SID. Еще раз в статью KB243330 (http://support.microsoft.com/kb/243330/ru).
SID: S-1-5-домен-500
Название: Администратор
Это учетная запись, UserAccount.
Курсивом выделенное домен - это буквы/цифры из SID домена или компьютера (уникальные для каждого компьютера). Значит, для получения имени встроенной учетки Администратор достаточно найти такой UserAccount, у которого SID = S-1-5-любая_последовательность_символов-500. В языке запросов SQL (или WQL) это делается оператором LIKE (http://msdn.microsoft.com/en-us/library/aa392263(VS.85).aspx) (любая последовательность задается спецсимволом "%" (процент)) в условии WHERE:
LocalAccount = True And SID Like 'S-1-5-%-500'
LocalAccount нужно, если комп в домене (чтобы выбиралась только локальная учетка). Примем во внимание, что в батнике символ "%" также является специальным, для его экранирования нужно продублировать: %%.
Надеюсь, теперь вам понятно, как формируется условие WHERE в 13-м посту?
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
:tomato2:
volk1234
31-07-2009, 02:33
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
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
Ну это уже черезчур.
Легче и правда тупо писать в двух наименованиях УЗ определить язык ОС да и все.
Я так в одном скрипте и сделал:
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
Такой вот скриптик запущенный 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()
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.