2009-08-16 40 views
5

Tôi muốn viết một ứng dụng nhỏ nằm trong khay của tôi và cho phép tôi chọn một ứng dụng có thể thực thi và ngăn không cho nó mở.Làm thế nào để dừng ứng dụng từ khi mở

Giao diện người dùng của ứng dụng rất dễ sử dụng WinForms.

Điều tôi muốn biết là làm cách nào để phát hiện xem một exe nào đó có bị xóa hay không và sau đó làm thế nào để ngừng chạy nó. Tôi khá chắc chắn tôi sẽ phải đào sâu vào một số công cụ Win32 nhưng tôi không có kinh nghiệm trong khu vực đó, do đó bài đăng này.

Có một ứng dụng hiện có tương tự như thế này, nhưng tôi không thể cho cuộc sống của tôi nhớ những gì nó được gọi là. Nó được viết bằng VB6 và nó cũng là nguồn mở.

Bất kỳ trợ giúp nào được đánh giá cao.

Cảm ơn.

+2

Tại sao bạn muốn ngăn chặn ứng dụng mở? Và sẽ không tốt hơn nếu chỉ giới hạn quyền người dùng để ứng dụng không thể mở được? –

+0

vâng tôi nhìn vào thiết lập các chính sách nhóm nhưng tôi phát hiện ra rằng các ứng dụng vẫn có thể được miễn trừ khỏi CMD vì vậy tôi cần phải vô hiệu hóa mà quá mà tôi không muốn làm. – Spidey

+1

Không, bạn có thể tự đặt ACL trên các tệp sao cho chúng không thể được thực thi. –

Trả lời

9

Thay vì cố gắng để giết quá trình khi nó chạy, làm thế nào để ngăn chặn nó chạy ở nơi đầu tiên?

Thay đổi những gì sẽ xảy ra khi vỏ cố gắng để khởi động một ứng dụng rất đơn giản - thêm một khóa registry mới để HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File chọn Thực hiện

Để kiểm tra điều này tôi đã thêm một khóa đăng ký được gọi là notepad.exe và trong giá trị chuỗi này Trình gỡ lỗi với giá trị calc.exe.Bây giờ bất cứ khi nào tôi cố gắng và chạy calc notepad sẽ mở ra. Sau đây là khóa đăng ký đã xuất.

REGEDIT4 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] 
"Debugger"="calc.exe" 

Đã thực hiện thay đổi này mà tôi chưa quản lý để mở notepad, không tệ đối với giải pháp không có mã. Nếu bạn cần chắc chắn 100% rằng ứng dụng không bao giờ chạy, bạn luôn có thể thêm một giải pháp "giết" quá chi tiết bởi những người khác.

+0

Đây là một phương pháp tuyệt vời Stephen. Tôi có thể thêm nó vào ứng dụng nên bây giờ thay vì bỏ phiếu mỗi 10 giây nó chỉ thay đổi registry một lần. Ngọt ngào. – Spidey

0

Tôi nhớ một số chức năng của Win32 giúp giải quyết các tình huống như vậy. Nếu bạn đang sử dụng. Net anyway có lẽ sẽ là một nỗi đau để thực hiện. Tôi sẽ sử dụng một số các đối tượng đồng bộ hóa quá trình chéo (không biết trong đầu của tôi mà những người đang cross-process) và sẽ thiết lập một số tín hiệu. Khi khởi động chỉ cho phép ứng dụng của bạn kiểm tra xem tín hiệu đã được đặt chưa. Nếu có, chỉ cần đóng lại ứng dụng.

0

Một trong những ý tưởng, nhưng không tốt nhất là xem các quy trình đang chạy và giết quá trình chạy cần thiết khi tìm thấy, điều này có thể được thực hiện bằng mã C# được quản lý bình thường.

+0

vâng đây là phương pháp tôi đang sử dụng cho đến nay. Điều này sẽ đóng ứng dụng sau khi nó được mở ra để nó giúp tôi có 90% ở đó. tin bool KillProcess (string name) { foreach (Process clsProcess trong Process.GetProcesses()) { if (clsProcess.ProcessName.ToLower(). StartsWith (name.ToLower())) { clsProcess. Giết chết(); trả về true; } } trả về false; } Tôi chỉ tự hỏi liệu nó có đáng để dành thời gian nghiên cứu móc cửa sổ (mà tôi không biết gì về việc này) để thuận tiện cho việc chặn ứng dụng tức thời hay không. – Spidey

+0

ok, mã đó không định dạng đúng. – Spidey

1

Móc Windows sẽ giải quyết được sự cố của bạn. Tôi chưa bao giờ thử điều này ... nhưng bạn sẽ phải làm một số pinvoke để Win32 API để đạt được điều này. Google Win32 móc và xem.

0

thay vì đợi tệp thực thi mở, vì vậy bạn có thể đóng lại, bạn cũng có thể làm tê liệt tệp thực thi.

chỉ cần thay đổi một vài byte trong tiêu đề exe và ngăn không cho nó theo cách đó từ bao giờ bắt đầu.

Chỉ cần thực hiện theo cách mà hiệu ứng có thể đảo ngược.

0
private bool KillProcess(string name) 
    { 
     foreach (Process clsProcess in Process.GetProcesses()) 
     { 
      if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower())) 
      { 
       clsProcess.Kill(); 
       return true; 
      } 
     } 
     return false; 
    } 

vâng đây là phương pháp tôi đang sử dụng cho đến thời điểm này. Điều này sẽ đóng ứng dụng sau khi nó được mở ra để nó giúp tôi có 90% ở đó. Tôi sử dụng bộ hẹn giờ kiểm tra sau mỗi 10 giây. Tôi chỉ tự hỏi nếu nó có giá trị dành thời gian nghiên cứu móc cửa sổ (mà tôi không biết gì về) cho sự tiện lợi của ứng dụng ngay lập tức chặn. Những ai trong số các bạn biết về Win32 của Win32, có xứng đáng với nỗ lực không?

0
internal static class Program 
{ 
    private static Mutex m; 

    [STAThread] 
    private static void Main() 
    { 
     bool flag; 
     m = new Mutex(true, "ProgramName", out flag); 
     if (!flag) 
     { 
      MessageBox.Show("Another instance is already running."); 
     } 
     else 
     { 
      //start program 
     } 
    } 
} 

Tôi đang sử dụng chương trình này và chương trình hoạt động hoàn hảo và có thể thay đổi điều này theo nhu cầu của bạn.

+0

Mã của tôi có hiệu quả giống như vậy. I E.Tìm một quy trình và xử lý nó. – Spidey

+0

có nó, nhưng những người để đánh giá TẤT CẢ các quy trình, với tôi, bạn chỉ có thể có một danh sách các Mutexes và kiểm tra nó. Bên cạnh đó, giải pháp của tôi dành cho một thứ khác - ngăn ứng dụng OWN của bạn mở hai lần. Tôi chỉ đơn giản là hiểu lầm câu hỏi chính nó, bằng cách đọc qua nó quá nhanh :) – Femaref

0

Bạn có thể viết móc chung.

Điều gì sẽ được nối là ít quan trọng hơn thực tế nó sẽ là toàn cầu, và do đó, được triển khai trong một DLL riêng biệt. Trong thư viện đó, bạn xử lý đúng cách gắn vào một mô-đun mới. Nếu bạn phát hiện quá trình trùng lặp - hãy xóa nó.

5

Chỉ cần một bổ sung nhỏ để câu trả lời nếu không xuất sắc Stephen Nutt của:

Nếu bạn muốn chương trình ra đi mãi mãi, không chỉ bật lên cái gì khác thay nó (calc.exe trong ví dụ Stephen). Định khóa: "Debugger" = "ntsd -cq"

này sẽ gọi NT là luôn hiện diện dòng lệnh debugger ntsd cho chương trình với các đối số dòng lệnh -c nói "thực hiện lệnh debugger được chỉ định tiếp theo "; lệnh trình gỡ lỗi là q (có nghĩa là thoát). Điều này sẽ ngăn chặn trình gỡ lỗi, mà như là một tác dụng phụ sẽ giết debuggee - chương trình bạn muốn ngăn chặn từ chạy - quá.

Sạch sẽ, đẹp và dễ dàng. Tác dụng phụ duy nhất tôi quan sát thấy là đôi khi một cửa sổ lệnh tạm thời bật lên nhanh chóng với một dấu nhắc trình gỡ rối chỉ để biến mất một lần nữa trong giây lát.

+0

Cảm ơn vì điều đó, tôi đã tự hỏi nên đặt gì thay vì calc.exe. – Spidey

1

OK, tôi vừa tìm thấy ứng dụng tôi đã tìm kiếm ban đầu.

Nó được gọi là Temptation Blocker và nó available here

Nó sẽ tìm thấy tất cả các file thực thi và cho phép bạn chọn những gì để chặn cho tuy nhiên nhiều giờ.

Nó không hoàn hảo, tôi muốn nó sẽ tự động bắt đầu vì vậy tôi không phải tự khởi động nó, nhưng ngoài ra nó là khá tốt

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