Windows的服務程式在Vista開始
與使用者程式分開,獨立在session 0執行
如此一來服務就無法直接與使用者桌面的sessions互動
即無法使用PostMessage和SendMessage傳遞訊息
ref: Service Changes for Windows Vista
但服務仍然有程式間通訊的需求
必須透過特定寫法實作,如:
- WTSSendMessage (用途即MessageBox)
- RunProcessAsUser (在該使用者session執行一個child process)
- IPCs
- Events
- Named Pipes
- Mailslots
- Memory-Mapped files
- Sockets
根據不同需求來選用不同寫法
ref: Application Compatibility – Session 0 Isolation
IPC通常會創建一個kernel object來進行操作,其中需要一個security attributes的參數
無獨有偶在使用RunProcessAsUser也需要這樣一個參數
ref: 穿透Session 0 隔离(二)(WTSSendMessage/RunProcessAsUser)
在Session 0執行的程式為SYSTEM帳號權限,而security attributes使用預設設定(傳NULL)時
The ACLs in the default security descriptor for a named pipe grant full control to the LocalSystem account, administrators, and the creator owner. They also grant read access to members of the Everyone group and the anonymous account.
則只有同樣擁有admin才能完整存取,否則只能讀
但是反過來由其他session當write end,服務程式當read end就可行
回到正題,對於security attributes較好的設定是利用well-known SIDs指定允許full access的對象
使用的方式在此
而我的選擇是直接將DACL設為NULL
在security attributes的屬性中,DACL代表可存取控制列表,每個節點代表一個允許的對象和權限
但DACL為NULL時,則Everyone都可以得到full access control
The SECURITY_ATTRIBUTES struct and CreateNamedPipe()
Events也需要相同的權限設定方式
Memory mapped file就不一樣了
這部分我並未做嘗試