Go版本的以服務的方式進行ui行程守護,windows需要以管理員的權限創建行程才能進行ui互動
func ShellExecuteByAdmin(file *uint16, args *uint16) (rt bool) {
proc, err := FindProcessByName(“explorer.exe”)
if err != nil {
return false
}
processHandle, err := syscall.OpenProcess(windows.PROCESS_QUERY_INFORMATION|windows.PROCESS_VM_READ, false, uint32(proc.ProcessID))
if err != nil {
fmt.Printf(“could not open process %d, reason: %s”, proc.ProcessID, err.Error())
return false
}
var hToken syscall.Token
err = syscall.OpenProcessToken(processHandle, syscall.TOKEN_ALL_ACCESS, &hToken)
if err != nil {
fmt.Printf(“could not open processtoken %d, reason: %s”, processHandle, err.Error())
return false
}
si := new(syscall.StartupInfo)
si.XSize = uint32(unsafe.Sizeof(*si))
si.Desktop, err = syscall.UTF16PtrFromString(“winsta0\default”)
si.ShowWindow = syscall.SW_HIDE
si.Flags = syscall.STARTF_USESHOWWINDOW
si.Flags |= syscall.STARTF_USESHOWWINDOW
si.ShowWindow = syscall.SW_HIDE
si.StdInput = syscall.Handle(0) //fd[0]
si.StdOutput = syscall.Handle(0) //fd[1]
si.StdErr = syscall.Handle(0) //fd[2]
pi := new(syscall.ProcessInformation)
flags := windows.CREATE_NEW_CONSOLE | windows.CREATE_DEFAULT_ERROR_MODE | syscall.CREATE_UNICODE_ENVIRONMENT
err = syscall.CreateProcessAsUser(hToken, file, args, nil, nil, false, uint32(flags), nil, nil, si, pi)
if err != nil {
fmt.Println(“CreateProcessAsUser err”, err.Error())
return false
}
return true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/256852.html
標籤:區塊鏈
下一篇:2021-02-04:第一年農場有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都會生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟 ③每一只母牛永遠不會死 。請問N年后牛的數量是多少 ?
