2008-11-27 40 views
9

Tôi đang tìm phiên bản đảo ngược của "RunOnceEx".Làm cách nào để chạy chương trình của tôi trước khi đăng xuất trên Windows XP?

RunOnceEx chạy một số chương trình, trước khi trình bao (desktop & thanh tác vụ) của người dùng bắt đầu. Tiến trình đăng nhập sẽ không tiếp tục trước khi runonceex hoàn tất.

Tôi muốn thực hiện chính xác nhưng đăng xuất của người dùng. Khi cô ấy đăng xuất, tất cả chạy chương trình tắt máy, để lại shell (desktop & thanh tác vụ), sau đó "" Tôi muốn chương trình của tôi sẽ được thực hiện thời điểm này "", cuối cùng đăng xuất.

Tôi nghĩ có thể vì "mobsync.exe" đang thực hiện điều đó. Nhưng tôi không thể tìm thấy ở đâu và làm thế nào để làm điều đó.

+0

Tôi đã hỏi một cách "lập trình" - đó, tôi có thể thiết lập nó trong khi cài đặt của tôi hoặc một tùy chọn trong ứng dụng. Chính sách nhóm là tuyệt vời, nhưng nó chỉ không khắc phục được yêu cầu. Microsoft có mã hóa cứng "mobsync.exe" không? –

+1

Như @VonC cho biết, justr thêm một số entires đăng ký. khó khăn như thế nào! – TFD

+0

Bạn đang tìm kiếm giải pháp trong C/C++ hoặc .NET? Ngoài ra, mobsync.exe là một chương trình của Microsoft và nhiều khả năng sử dụng các mục Đăng ký như tất cả các câu trả lời mà bạn đang từ chối. –

Trả lời

4

Để chỉ chạy ứng dụng này cho người dùng hiện tại, bạn có thể sử dụng WMI để nhận thông tin khi tắt/đăng xuất.

Hoặc bạn viết một ứng dụng C# nhỏ (hoặc bất kỳ ngôn ngữ nào khác có thể sử dụng WMI) hoặc tập lệnh vbs để nghe trên sự kiện W2 Win32_ComputerShutdownEvent WMI.

Một ví dụ C# ứng dụng có thể được tìm thấy ở đây trong câu hỏi này: Get Log off event from system

3

tìm thấy trong kết quả đầu tiên trên google cho tôi

Để thực thi chương trình, bạn có thể tạo tập lệnh để chạy tập lệnh và sử dụng chính sách nhóm để thực thi nó. Trong Group Policy Editor điều hướng đến User Configuration -> Windows Settings -> Scripts (Logon/Logoff)

more information here

+0

Như tôi đang yêu cầu trong stackoverflow, không superuser, tôi đang tìm kiếm các giải pháp cho chương trình –

7

Cảnh báo, như đã nói here, gpedit.msc sẽ cho phép bạn cấu hình một kịch bản logoff cho tất cả người dùng.

Nếu bạn chỉ cần tập lệnh đó cho một người dùng, bạn cần khai báo nó trực tiếp trong sổ đăng ký, cả hai trong số HKCUHKLM.

1

Những gì bạn cần là triển khai GINA. Bạn có thể chạy các lệnh tùy chỉnh của bạn trong WlxIsLogoffOk chức năng, mà được gọi khi người dùng bắt đầu một logoff

Khi bạn tạo GINA thích dll bạn có thể đăng ký nó ở đây: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

Đây là một thực hiện mà có thể phù hợp với nhu cầu của bạn (nó cung cấp khóa đăng ký Logoff nơi bạn có thể chỉ định lệnh của mình): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

+0

tôi có thể biết lý do tại sao nó được dành? –

+0

cảm ơn! Tôi đã tự hỏi rằng bản thân mình:/ –

+1

+1 bởi vì đây là một câu trả lời hợp pháp nhưng tôi nghĩ rằng thực hiện một dll GINA cho những gì người này muốn thực hiện là cách trên đầu trang. –

1

Như VonC và TFD đã đề cập, Trình chỉnh sửa chính sách nhóm chỉ là một cách khác để thao tác đăng ký.

Chỉ cần thực hiện với gpedit các thay đổi (trong Userconfig - Cài đặt Windows - Scripts) bạn thích và sau đó hãy xem trong sổ đăng ký tại [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts] để tìm hiểu cách bạn có thể thực hiện điều đó trực tiếp.

Cũng trên máy tính của tôi (treo trong một tên miền) là một thư mục ẩn C:\WINDOWS\System32\GroupPolicy với thư mục con cho người dùng và máy. Cả hai đều có các thư mục con bổ sung được gọi là Shutdown và Startup. Có lẽ bạn cũng có thể sử dụng những cái này.

0

Nếu bạn cần một cái gì đó đơn giản và làm việc cho một người dùng (hoặc bất kỳ), bạn có thể tạo một ứng dụng đơn giản trong C++ hoặc C# chẳng hạn.

Đơn giản nhất là có C# trong khay (bằng cách thêm thành phần khay vào biểu mẫu) và đăng ký và xử lý sự kiện cho sự kiện FormClosing.Nó sẽ giống như sau:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason != CloseReason.UserClosing) 
     { 
      // It's not the user closing the application, 
      // Let's do whatever you want here, for example starting a process 
      Process notePad = new Process(); 

      notePad.StartInfo.FileName = "notepad.exe"; 
      notePad.StartInfo.Arguments = "ProcessStart.cs"; 

      notePad.Start(); 
     } 
    } 

Vì vậy, ứng dụng của bạn sẽ được bắt đầu với Windows hoặc với người dùng. Nó sẽ chờ đợi (sử dụng một chút bộ nhớ) và sẽ làm điều gì đó khi hệ thống tắt, hoặc người dùng đăng xuất, vv (bằng cách kiểm tra "CloseReason" ở trên).

3

Nếu bạn muốn chạy chương trình thực thi mã khi đăng xuất, bạn nên móc thông báo WM_QUERYENDSESSION và tìm giá trị lParam của ENDSESSION_LOGOFF (0x80000000).

Điều quan trọng là phải kiểm tra giá trị lParam này vì các quy tắc khác cho biết "đóng bắt buộc" - tức là quy trình của bạn có thể bị giết trước khi mã của bạn được phép chạy. Trên thực tế, hầu hết các tin nhắn tắt máy/phiên cuối chỉ nhằm mục đích cung cấp cho bạn cơ hội để chạy mã dọn dẹp vào phút cuối và không an toàn để phản hồi với các hành động dài hạn; nhưng sự kết hợp đặc biệt này sẽ ổn.

Lưu ý: Tôi chưa từng thực sự chạy một quá trình riêng biệt để phản hồi thông báo WM_QUERYENDSESSION. Có thể trình quản lý cửa sổ sẽ không cho phép điều này, giống như trong quá trình tắt máy. Hãy thử nó và xem, tôi đoán.

Nếu bạn đang ở trong môi trường .NET (bạn không chỉ định), cách nhanh hơn là thêm trình xử lý sự kiện vào sự kiện Microsoft.Win32.SystemEvents.SessionEnding.

Các vấn đề liên quan