2010-02-15 1 views
6

Est-il possible d'appliquer (et de supprimer) les paramètres de stratégie de groupe Windows à l'aide de .NET?Comment appliquer la stratégie de groupe Windows à l'aide de .NET?

Je travaille sur une application qui doit temporairement mettre une machine dans un état restreint, comme un kiosque. L'une des choses que je dois contrôler est l'accès aux lecteurs USB que je crois pouvoir faire grâce à la politique de groupe. Je souhaite que mon application définisse la stratégie au démarrage et rétablisse la modification lorsqu'elle se termine ... est-ce quelque chose que je peux faire à travers des appels au framework .NET?

Ce sont mes principales exigences:

  • Appliquer les paramètres de stratégie de groupe lorsque mon application console est lancée.
  • Identifiez le moment où une action d'utilisateur est refusée par la stratégie et consignez-la.
    • La journalisation dans le journal de sécurité du système est acceptable.
  • Annuler mes modifications de stratégie lorsque mon application s'arrête.
+0

Il me semble que l'exécution de votre application en tant qu'utilisateur limité est beaucoup plus sûre que l'exécution en tant qu'utilisateur surélévé qui peut modifier les stratégies de groupe sur l'ordinateur. – Will

+0

D'accord, mais cela ne fonctionne pas pour ce scénario particulier. Cette application est installée sur des systèmes que je ne contrôle pas assez longtemps pour permettre à un utilisateur d'effectuer des actions chronométrées dans le sandbox restreint que nous fournissons, puis mon application est supprimée. Je ne peux pas supposer qu'un compte d'utilisateur suffisamment restreint existe déjà, d'où mon désir de créer l'environnement à la volée. –

+0

Je ne pense pas que vous pouvez changer la politique locale par le code managé. Cela peut seulement être fait par l'IGroupPolicyObject dans C \ C++ –

Répondre

3

Essayez d'utiliser 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; 
} 

Vous pouvez appeler cette fonction comme ça ..

// 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

Merci pour la réponse. Malheureusement, je cherchais quelque chose en C#, bien que j'aurais probablement dû le préciser. Même si cela ne m'aide pas, je le signale comme étant la bonne réponse parce que c'est la meilleure réponse à la question que j'ai posée et la plus susceptible d'aider quelqu'un à chercher une solution similaire. –

+0

Quelles seraient les valeurs HKEY_CURRENT_USER ?? et REG_DWORD ??? par exemple? – Danilo

+0

@ SethPetry-Johnson Quelles seraient les valeurs HKEY_CURRENT_USER ?? et REG_DWORD ??? par exemple? – Danilo

0

Je n'ai pas joué avec moi-même, mais System.Security.Policy semble être un point de départ intéressant.

lien affiché Re-as demandé: Group Policy access via Registry

+1

System.Security.Policy semble être lié à la sécurité d'accès de code de CLR, qui n'est pas ce que je suis après. Merci quand même! –

+0

Hmm, vous avez raison. Que diriez-vous - il semble qu'il n'y ait pas d'objet .NET maniable pour manipuler les entités GP, mais ce lien [http: //www.devx.com/dotnet/Article/34784/1763/page/5] parle de le faire via le Registre (qui est, après tout, où les choses de GP vit réellement). C'est ASP.NET, mais ça pourrait être un moyen ... –

+0

Cela semble prometteur, même si j'espère que la prime que je viens d'ajouter m'aidera à trouver une réponse plus directe. Pourriez-vous re-poster ce lien comme une nouvelle réponse? De cette façon, si aucune meilleure réponse n'est fournie, vous obtiendrez la prime à l'expiration. –

2

Check out www.sdmsoftware.com/group_policy_scripting. Ce n'est pas gratuit mais fera exactement ce que vous recherchez.

+0

Merci pour le lien. Malheureusement, il semble cher (il est généralement quand vous devez contacter les ventes pour un devis) et est probablement trop pour mes besoins sur ce projet. Mais vous avez raison, il semble faire ce que j'ai demandé :) –

3

NOTE: J'utilise deux références d'assemblage GroupPolicy: C: \ Windows \ Assembly \ GAC_MSIL \ Microsoft .GroupPolicy.Management \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.GroupPolicy.Management.dll et C: \ Windows \ assembly \ GAC_32 \ Microsoft.GroupPolicy.Management.Interop \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.Grou pPolicy.Management.Interop.dll Ce cadre 2.0, donc il ya du code mixte, et vous devez utiliser 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

Je l'ai fait comme ça.

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; 
     } 
    } 
Questions connexes