2016-04-15 72 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