2016-04-15 70 views
0

我試圖製作一個在Windows環境中持久化的python腳本。我使用PyInstaller來創建一個exe文件。我設法讓這個腳本只能在Windows XP環境下運行,而不能在任何其他版本的Windows上運行。我可以將該exe文件移動到%temp%文件夾,但它不會寫入註冊表中的「Software \ Microsoft \ Windows \ CurrentVersion \ Run」。我很樂意讓你們在代碼上給我你的意見。有沒有更有效的方法來寫入註冊表?Python註冊表持久性

import sys, base64, os, socket, subprocess 
from _winreg import * 

def autorun(tempdir, fileName, run): 
# Copy executable to %TEMP%: 
    os.system('copy %s %s'%(fileName, tempdir)) 

# Queries Windows registry for the autorun key value 
# Stores the key values in runkey array 
    key = OpenKey(HKEY_LOCAL_MACHINE, run) 
    runkey =[] 
    try: 
     i = 0 
     while True: 
      subkey = EnumValue(key, i) 
      runkey.append(subkey[0]) 
      i += 1 
    except WindowsError: 
     pass 

# If the autorun key "helloworld" isn't set this will set the key: 
    if 'helloworld' not in runkey: 
     try: 
      key= OpenKey(HKEY_LOCAL_MACHINE, run,0,KEY_ALL_ACCESS) 
      SetValueEx(key ,'helloworld',0,REG_SZ,r"%TEMP%\hello.exe") 
      key.Close() 
     except WindowsError: 
      pass 

def hello(): 
    print "hello world" 

def main(): 
    tempdir = '%TEMP%' 
    fileName = sys.argv[0] 
    run = "Software\Microsoft\Windows\CurrentVersion\Run" 
    autorun(tempdir, fileName, run) 
    hello() 

if __name__ == "__main__": 
     main() 

回答

0

寫入註冊表的事情是,您可能會發現您需要以管理員身份運行應用程序。這可能是你在不同環境中有不同表演的原因。

如果您沒有嚴格綁定到註冊表,您可以嘗試使用pickle在會話之間保存信息。這有利於跨平臺。

+0

感謝您的反饋意見。我實際上通過將HKEY_LOCAL_MACHINE更改爲HKEY_CURRENT_USER來解決問題。但我有一個新問題。由於某種原因,它不會自動啓動。 – holograms

+0

沒關係我得到它的工作。謝謝 – holograms

0

我通過用HKEY_CURRENT_USER替換HKEY_LOCAL_MACHINE值來解決此問題。我仍然遇到與.exe文件重新啓動後沒有運行的問題。

+0

使用'REG_EXPAND_SZ'作爲數據類型,使Window shell擴展'%TEMP%'環境變量。但是,我建議在將其寫入註冊表之前擴展路徑,例如'os.path.join(os.environ [「TEMP」],「hello.exe」)'。肯定堅持使用'HKCU'而不是'HKLM',因爲其他用戶將無權訪問當前用戶的臨時目錄。 – eryksun

+0

這絕對會使它看起來更好,完整的路徑,但它仍然不會自動運行。我不知道爲什麼=( – holograms

+0

你是否在兩個調用中都使用HKCU?你存儲'fileName'的值還是硬編碼'hello.exe'?你確定複製成功嗎?我會用[ shutil.copy'](https://docs.python.org/2/library/shutil.html#shutil.copy)而不是cmd shell,但是如果我確實使用了cmd,我會在空格的情況下使用引號並檢查該調用:'subprocess.check_call('copy'%s「」%s「'%(fileName,tempdir),shell = True)'。 – eryksun