2013-04-18 2 views
3

Я разрабатываю небольшой инструмент управления паролями, используя Python. Он позволяет использовать центральный менеджер паролей и одноразовые пароли, поэтому никто никогда не узнает пароль сервера, и нам не нужно будет менять все пароли, когда сотрудник перейдет к другому работодателю.Изменение пароля Windows с помощью Python

В любом случае, дизайн программного обеспечения был для него в Phone-Home (и, таким образом, устраняет многие проблемы с брандмауэром/Natting) и запускается как служба. Теперь мы можем синхронизировать пользователей системы, проверить, правильно ли получены пароли. Но сброс пароля после входа в систему - это то, с чем мы сейчас сталкиваемся.

win32.net NetUserchangePassword, похоже, имеет то, что мы хотим. Как я думал, он называется «net user *». После тестирования я понял, что это действительно называется функцией netUserchangePassword для msvc-библиотек. Проблема в том, что он не работает, когда я вводил старый пароль как None.

Процесс работает как полный админ. И должен иметь возможность изменять пароли пользователей, не зная старого (ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я из фонового раздела unix, поэтому root (superadmin) может делать все, ciorrect me, если я ошибаюсь в ОС Windows).

Итак, как я могу как супер-администратор изменить пароль для локальных пользователей, не зная старый пароль с использованием языка сценариев Python?

Спасибо!

Update:

def set_password(username, password): 
    from win32com import adsi 
    ads_obj = adsi.ADsGetObject("WinNT://localhost/%s,user" % username) 
    ads_obj.Getinfo() 
    ads_obj.Put('Password', password) 
    ads_obj.SetInfo() 


def verify_success(username, password): 
    from win32security import LogonUser 
    from win32con import LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT 
    try: 
     LogonUser(username, None, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT) 
    except: 
     return False 
    return True 

u = "test_usr" 
p = "[email protected]$w0rd!" 
set_password(u, p) 
if verify_success(u, p): 
    print "W00t it workz" 
else: 
    print "Continue Googling" 

Угадайте, что не работает.

+0

Figuredout метод, который _might_ работа: В псевдо-C: HRESULT SetPassword (const char * имя пользователя, пароль BSTR) { HRESULT hr = S_OK; IADsUser * pUser; pUser = GetObject ("WinNT: // MYCOMPUTER /" + имя пользователя + ", пользователь"); if (! PUser) {return E_FAIL;} hr = pUser-> SetPassword (пароль); if (hr == S_OK) printf («Установлен пароль пользователя»); pUser-> Release(); return hr; } – Stolas

ответ

1

В примере. Изменение:

ads_obj.Put('Password', password) 
ads_obj.SetInfo() 

С:

ads_obj.SetPassword(password) 

Issue решена :)

3

, что будет работать нормально

import subprocess 

subprocess.call("net users "+username+" "+password, shell = True) 
+4

Если имя пользователя или пароль введены пользователем, не используйте этот код. – Stolas

Смежные вопросы