我正在使用Python开发一个小型密码管理工具。它可以实现中央密码管理和一次性密码,因此没有人会知道服务器的密码,员工离职时也不需要更改所有密码。
软件的设计旨在实现Phone-Home并作为服务运行(从而消除很多防火墙/网络地址转换问题)。我们现在可以同步系统用户,验证我们得到的密码是否正确。但是,目前我们正在努力解决登录后重置密码的问题。
win32.net NetUserchangePassword似乎拥有我们想要的功能。我认为它被称为"net user *"。经过测试,我发现它真正调用了msvc库的netUserchangePassword功能。问题在于,当我将旧密码输入为None时,它无法工作。
该进程以完整管理员身份运行。应该能够在不知道旧密码的情况下更改用户密码(免责声明:我来自Unix背景,因此root(超级管理员)可以做任何事情,请纠正我如果我对Windows OS有所不了解)。
那么,作为超级管理员,我如何使用Python脚本语言更改本地用户的密码而不知道旧密码呢?
谢谢!
更新:
猜猜看,不起作用。
软件的设计旨在实现Phone-Home并作为服务运行(从而消除很多防火墙/网络地址转换问题)。我们现在可以同步系统用户,验证我们得到的密码是否正确。但是,目前我们正在努力解决登录后重置密码的问题。
win32.net NetUserchangePassword似乎拥有我们想要的功能。我认为它被称为"net user *"。经过测试,我发现它真正调用了msvc库的netUserchangePassword功能。问题在于,当我将旧密码输入为None时,它无法工作。
该进程以完整管理员身份运行。应该能够在不知道旧密码的情况下更改用户密码(免责声明:我来自Unix背景,因此root(超级管理员)可以做任何事情,请纠正我如果我对Windows OS有所不了解)。
那么,作为超级管理员,我如何使用Python脚本语言更改本地用户的密码而不知道旧密码呢?
谢谢!
更新:
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 = "TheNewStrongP@S$w0rd!"
set_password(u, p)
if verify_success(u, p):
print "W00t it workz"
else:
print "Continue Googling"
猜猜看,不起作用。
HRESULT SetPassword(const char *username, BSTR password) { HRESULT hr=S_OK; IADsUser *pUser; pUser = GetObject("WinNT://MYCOMPUTER/" + username + ",user"); if(!pUser) { return E_FAIL;} hr = pUser->SetPassword(password); if (hr == S_OK) printf("用户密码已设置"); pUser->Release(); return hr; }
- Stolas