2021-02-04

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
































}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章