2010-02-15 12 views
6

Có thể áp dụng (và loại bỏ) cài đặt chính sách nhóm Windows bằng .NET không?Làm cách nào để áp dụng chính sách nhóm Windows bằng .NET?

Tôi đang làm việc trên một ứng dụng cần phải tạm thời đặt máy vào trạng thái hạn chế giống như kiosk. Một trong những điều tôi cần kiểm soát là truy cập vào ổ USB mà tôi tin rằng mình có thể thực hiện thông qua chính sách nhóm. Tôi muốn ứng dụng của tôi đặt chính sách khi nó bắt đầu và hoàn nguyên thay đổi khi nó thoát ... đây có phải là điều tôi có thể thực hiện thông qua các cuộc gọi khuôn khổ .NET không?

Đây là những yêu cầu chính của tôi:

  • Áp dụng cài đặt chính sách nhóm khi ứng dụng giao diện điều khiển của tôi được bắt đầu.
  • Xác định khi nào hành động của người dùng bị từ chối bởi chính sách và ghi lại nó.
    • Ghi nhật ký bảo mật hệ thống là chấp nhận được.
  • Hoàn nguyên thay đổi chính sách của tôi khi ứng dụng của tôi dừng.
+0

Dường như với tôi rằng việc chạy ứng dụng của bạn với tư cách người dùng bị hạn chế là an toàn hơn nhiều so với hoạt động của người dùng nâng cao có thể thay đổi chính sách nhóm trên máy tính. – Will

+0

Đồng ý, nhưng điều đó không hoạt động cho trường hợp cụ thể này. Ứng dụng này được cài đặt trên các hệ thống tôi không kiểm soát đủ lâu để người dùng thực hiện một số hành động được hẹn giờ trong hộp cát bị hạn chế mà chúng tôi cung cấp và sau đó ứng dụng của tôi bị xóa. Tôi không thể giả định rằng một tài khoản người dùng bị hạn chế đầy đủ đã tồn tại, do đó mong muốn của tôi tạo môi trường khi đang bay. –

+0

Tôi không nghĩ rằng bạn có thể thay đổi chính sách địa phương thông qua mã được quản lý. Điều này chỉ có thể được thực hiện thông qua các IGroupPolicyObject trong C \ C++ –

Trả lời

3

Hãy thử sử dụng IGroupPolicyObject

bool SetGroupPolicy(HKEY hKey, LPCTSTR subKey, LPCTSTR valueName, DWORD dwType, const BYTE* szkeyValue, DWORD dwkeyValue) 
{ 
    CoInitialize(NULL); 
    HKEY ghKey, ghSubKey, hSubKey; 
    LPDWORD flag = NULL; 
    IGroupPolicyObject *pGPO = NULL; 
    HRESULT hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_ALL, IID_IGroupPolicyObject, (LPVOID*)&pGPO); 

    if(!SUCCEEDED(hr)) 
    { 
     MessageBox(NULL, L"Failed to initialize GPO", L"", S_OK); 
    } 

    if (RegCreateKeyEx(hKey, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSubKey, flag) != ERROR_SUCCESS) 
    { 
     return false; 
     CoUninitialize(); 
    } 

    if(dwType == REG_SZ) 
    { 
     if(RegSetValueEx(hSubKey, valueName, 0, dwType, szkeyValue, strlen((char*)szkeyValue) + 1) != ERROR_SUCCESS) 
     { 
      RegCloseKey(hSubKey); 
      CoUninitialize(); 
      return false; 
     } 
    } 

    else if(dwType == REG_DWORD) 
    { 
     if(RegSetValueEx(hSubKey, valueName, 0, dwType, (BYTE*)&dwkeyValue, sizeof(dwkeyValue)) != ERROR_SUCCESS) 
     { 
      RegCloseKey(hSubKey); 
      CoUninitialize(); 
      return false; 
     } 
    } 

    if(!SUCCEEDED(hr)) 
    { 
     MessageBox(NULL, L"Failed to initialize GPO", L"", S_OK); 
     CoUninitialize(); 
     return false; 
    } 

    if(pGPO->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY) != S_OK) 
    { 
     MessageBox(NULL, L"Failed to get the GPO mapping", L"", S_OK); 
     CoUninitialize(); 
     return false; 
    } 

    if(pGPO->GetRegistryKey(GPO_SECTION_USER,&ghKey) != S_OK) 
    { 
     MessageBox(NULL, L"Failed to get the root key", L"", S_OK); 
     CoUninitialize(); 
     return false; 
    } 

    if(RegCreateKeyEx(ghKey, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &ghSubKey, flag) != ERROR_SUCCESS) 
    { 
     RegCloseKey(ghKey); 
     MessageBox(NULL, L"Cannot create key", L"", S_OK); 
     CoUninitialize(); 
     return false; 
    } 

    if(dwType == REG_SZ) 
    { 
     if(RegSetValueEx(ghSubKey, valueName, 0, dwType, szkeyValue, strlen((char*)szkeyValue) + 1) != ERROR_SUCCESS) 
     { 
      RegCloseKey(ghKey); 
      RegCloseKey(ghSubKey); 
      MessageBox(NULL, L"Cannot create sub key", L"", S_OK); 
      CoUninitialize(); 
      return false; 
     } 
    } 

    else if(dwType == REG_DWORD) 
    { 
     if(RegSetValueEx(ghSubKey, valueName, 0, dwType, (BYTE*)&dwkeyValue, sizeof(dwkeyValue)) != ERROR_SUCCESS) 
     { 
      RegCloseKey(ghKey); 
      RegCloseKey(ghSubKey); 
      MessageBox(NULL, L"Cannot set value", L"", S_OK); 
      CoUninitialize(); 
      return false; 
     } 
    } 

    if(pGPO->Save(false, true, const_cast<GUID*>(&EXTENSION_GUID), const_cast<GUID*>(&CLSID_GPESnapIn)) != S_OK) 
    { 
     RegCloseKey(ghKey); 
     RegCloseKey(ghSubKey); 
     MessageBox(NULL, L"Save failed", L"", S_OK); 
     CoUninitialize(); 
     return false; 
    } 

    pGPO->Release(); 
    RegCloseKey(ghKey); 
    RegCloseKey(ghSubKey); 
    CoUninitialize(); 
    return true; 
} 

Bạn có thể gọi chức năng này như thế này ..

// Remove the Log Off in start menu 
SetGroupPolicy(HKEY_CURRENT_USER, 
    L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", 
    L"StartMenuLogOff", REG_DWORD, NULL, 1); 
+0

Cảm ơn câu trả lời. Thật không may tôi đã tìm kiếm một cái gì đó trong C#, mặc dù tôi có lẽ nên có quy định đó. Mặc dù điều này không giúp tôi tôi gắn cờ nó là câu trả lời đúng bởi vì nó là câu trả lời hay nhất cho câu hỏi mà tôi thực sự đã hỏi và có nhiều khả năng giúp ai đó tìm kiếm giải pháp tương tự. –

+0

Giá trị HKEY_CURRENT_USER là bao nhiêu? và REG_DWORD ??? chẳng hạn? – Danilo

+0

@ SethPetry-Johnson Giá trị HKEY_CURRENT_USER là bao nhiêu? và REG_DWORD ??? chẳng hạn? – Danilo

0

Tôi chưa tự chơi với nó, nhưng System.Security.Policy có vẻ như đây có thể là điểm bắt đầu thú vị.

liên kết Re-posted theo yêu cầu: Group Policy access via Registry

+1

System.Security.Policy dường như có liên quan đến bảo mật truy cập mã CLR, mà không phải là những gì tôi sau. Cảm ơn mặc dù! –

+0

Hmm, bạn nói đúng. Làm thế nào về điều này - có vẻ như không có đối tượng .NET tiện dụng để manupulate các thực thể GP, nhưng liên kết này [http: //www.devx.com/dotnet/Article/34784/1763/page/5] nói về việc thực hiện nó thông qua Registry (sau khi tất cả, nơi mà các công cụ GP thực sự tồn tại). Đó là ASP.NET, nhưng nó có thể là một cách ... –

+0

Điều đó có vẻ hơi hứa hẹn, mặc dù tôi hy vọng tiền thưởng mà tôi vừa thêm sẽ giúp tôi tìm ra câu trả lời trực tiếp hơn. Bạn có nhớ đăng lại liên kết đó làm câu trả lời mới không? Bằng cách đó, nếu không có câu trả lời tốt hơn được cung cấp, bạn sẽ nhận được tiền thưởng khi hết hạn. –

2

Check-out www.sdmsoftware.com/group_policy_scripting. Nó không miễn phí nhưng sẽ làm chính xác những gì bạn đang sau.

+0

Cảm ơn bạn đã liên kết. Thật không may nó _looks_ đắt tiền (nó thường là khi bạn phải liên hệ với bán hàng cho một báo giá) và có lẽ là overkill cho các nhu cầu của tôi về dự án này. Nhưng bạn là chính xác, nó dường như làm những gì tôi yêu cầu :) –

3

Chú ý: Tôi sử dụng hai tài liệu tham khảo lắp ráp GroupPolicy: C: \ Windows \ lắp ráp \ GAC_MSIL \ Microsoft .GroupPolicy.Management \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.GroupPolicy.Management.dll và C: \ Windows \ assembly \ GAC_32 \ Microsoft.GroupPolicy.Management.Interop \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.Grou pPolicy.Management.Interop.dll Khuôn khổ này 2.0, do đó, có mã hỗn hợp và bạn phải sử dụng app.config: http://msmvps.com/blogs/rfennell/archive/2010/03/27/mixed-mode-assembly-is-built-against-version-v2-0-50727-error-using-net-4-development-web-server.aspx

Tôi đã làm như vậy.

using System.Collections.ObjectModel; 
using Microsoft.GroupPolicy; 
using Microsoft.Win32; 

/// <summary> 
/// Change user's registry policy 
/// </summary> 
/// <param name="gpoName">The name of Group Policy Object(DisplayName)</param> 
/// <param name="keyPath">Is KeyPath(like string [email protected]"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer")</param> 
/// <param name="typeOfKey">DWord, ExpandString,... e.t.c </param> 
/// <param name="parameterName">Name of parameter</param> 
/// <param name="value">Value</param> 
/// <returns>result: true\false</returns> 
public bool ChangePolicyUser(string gpoName, string keyPath, RegistryValueKind typeOfKey, string parameterName, object value) 
    { 
     try 
     { 
      RegistrySetting newSetting = new PolicyRegistrySetting(); 
      newSetting.Hive = RegistryHive.CurrentUser; 
      newSetting.KeyPath = keyPath; 
      bool contains = false; 
      //newSetting.SetValue(parameterName, value, typeOfKey); 
      switch (typeOfKey) 
      { 
       case RegistryValueKind.String: 
        newSetting.SetValue(parameterName, (string)value, typeOfKey); 
        break; 
       case RegistryValueKind.ExpandString: 
        newSetting.SetValue(parameterName, (string)value, typeOfKey); 
        break; 
       case RegistryValueKind.DWord: 
        newSetting.SetValue(parameterName, (Int32)value); 
        break; 
       case RegistryValueKind.QWord: 
        newSetting.SetValue(parameterName, (Int64)value); 
        break; 
       case RegistryValueKind.Binary: 
        newSetting.SetValue(parameterName, (byte[])value); 
        break; 
       case RegistryValueKind.MultiString: 
        newSetting.SetValue(parameterName, (string[])value, typeOfKey); 
        break; 
      } 
      Gpo gpoTarget = _gpDomain.GetGpo(gpoName); 
      RegistryPolicy registry = gpoTarget.User.Policy.GetRegistry(false); 
      try 
      { 
       ReadOnlyCollection<RegistryItem> items = gpoTarget.User.Policy.GetRegistry(false).Read(newSetting.Hive, keyPath); 
       foreach (RegistryItem item in items) 
       { 
        if (((RegistrySetting) item).ValueName == parameterName) 
        { 
         contains = true; 
        } 
       } 
       registry.Write((PolicyRegistrySetting) newSetting, !contains); 
       registry.Save(false); 
       return true; 
      } 
      catch (ArgumentException) 
      { 
       registry.Write((PolicyRegistrySetting)newSetting, contains); 
       registry.Save(true); 
       return true; 
      } 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
Các vấn đề liên quan