2010-02-15 23 views
6

क्या .NET का उपयोग कर Windows समूह नीति सेटिंग्स को लागू करना (और निकालना) संभव है?.NET का उपयोग कर Windows समूह नीति को कैसे लागू करें?

मैं उस एप्लिकेशन पर काम कर रहा हूं जिसकी आवश्यकता अस्थायी रूप से एक मशीन को प्रतिबंधित, कियोस्क जैसी स्थिति में रखती है। उन चीज़ों में से एक जिन्हें मुझे नियंत्रित करने की आवश्यकता है, यूएसबी ड्राइव तक पहुंच है जो मुझे विश्वास है कि मैं समूह नीति के माध्यम से कर सकता हूं। मैं चाहता हूं कि मेरा ऐप पॉलिसी सेट करे और जब यह निकलता है तो परिवर्तन को वापस लाएं ... क्या यह कुछ है जो मैं .NET फ्रेमवर्क कॉल के माध्यम से कर सकता हूं?

  • समूह नीति सेटिंग्स लागू करें जब मेरे कंसोल अनुप्रयोग शुरू कर दिया गया है:

    ये मेरी प्राथमिक आवश्यकताओं हैं।

  • पहचानें कि नीति द्वारा किसी उपयोगकर्ता कार्रवाई को अस्वीकार कर दिया गया है और उसे लॉग इन करें।
    • सिस्टम सुरक्षा लॉग पर लॉग इन स्वीकार्य है।
  • मेरा ऐप बंद होने पर मेरी नीति में बदलावों को वापस लाएं।
+0

मुझे लगता है कि सीमित ऐप के रूप में अपना ऐप चलाने से एक उच्च उपयोगकर्ता के रूप में चलने से कहीं अधिक सुरक्षित है जो कंप्यूटर पर समूह नीतियों को बदल सकता है। – Will

+0

सहमत हैं, लेकिन यह इस विशेष परिदृश्य के लिए काम नहीं करता है। यह ऐप सिस्टम पर स्थापित हो जाता है, जो उपयोगकर्ता द्वारा प्रदान किए गए प्रतिबंधित सैंडबॉक्स के भीतर कुछ समय तक कार्य करने के लिए पर्याप्त समय तक नियंत्रित नहीं होता है, और फिर मेरा ऐप हटा दिया जाता है। मैं यह नहीं मान सकता कि पर्याप्त रूप से प्रतिबंधित उपयोगकर्ता खाता पहले से मौजूद है, इसलिए फ्लाई पर पर्यावरण बनाने की मेरी इच्छा है। –

+0

मुझे नहीं लगता कि आप प्रबंधित कोड के माध्यम से स्थानीय नीति को बदल सकते हैं। यह केवल IGroupPolicyObject के माध्यम से C \ C++ –

उत्तर

3

का उपयोग कर 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; 
} 

आप इस तरह इस समारोह कॉल कर सकते हैं की कोशिश करो ..

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

उत्तर के लिए धन्यवाद। दुर्भाग्य से मैं सी # में कुछ ढूंढ रहा था, हालांकि मुझे शायद यह निर्दिष्ट करना चाहिए था। भले ही यह मेरी मदद नहीं करता है, मैं इसे सही उत्तर के रूप में फ़्लैग कर रहा हूं क्योंकि यह वास्तव में पूछे जाने वाले प्रश्न का सबसे अच्छा जवाब है और किसी ऐसे समाधान की तलाश करने में किसी की मदद करने की संभावना है। –

+0

मूल्य HKEY_CURRENT_USER क्या होंगे ?? और उदाहरण के लिए REG_DWORD ??? – Danilo

+0

@ सेठपेट्री-जॉनसन मूल्य HKEY_CURRENT_USER क्या होंगे ?? और उदाहरण के लिए REG_DWORD ??? – Danilo

0

मैंने इसे अपने साथ नहीं खेला है, लेकिन सिस्टम.Security.Policy ऐसा लगता है कि यह एक दिलचस्प प्रारंभिक बिंदु हो सकता है।

पुन: तैनात लिंक के रूप में अनुरोध: Group Policy access via Registry

+1

सिस्टम में किया जा सकता है। सुरक्षा। पॉलिसी सीएलआर कोड एक्सेस सुरक्षा से संबंधित प्रतीत होता है, जो कि मैं बाद में नहीं हूं। हालांकि धन्यवाद! –

+0

हम्म, आप सही हैं। इसके बारे में - ऐसा लगता है कि जीपी इकाइयों को मैन्युफैक्चर करने के लिए कोई आसान .NET ऑब्जेक्ट नहीं है, लेकिन यह लिंक [http: //www.devx।कॉम/डॉटनेट/आलेख/34784/1763/पृष्ठ/5] रजिस्ट्री के माध्यम से ऐसा करने के बारे में बात करता है (जो कि आखिरकार, जहां जीपी सामान वास्तव में रहता है)। यह एएसपी.नेट है, लेकिन यह एक तरीका हो सकता है ... –

+0

यह कुछ हद तक आशाजनक दिखता है, हालांकि मुझे उम्मीद है कि मैंने अभी जो बाउंटी जोड़ा है, वह मुझे और अधिक सीधा जवाब खोजने में मदद करेगा। क्या आप उस लिंक को एक नए उत्तर के रूप में दोबारा पोस्ट करना चाहते हैं? इस तरह, यदि कोई बेहतर उत्तर प्रदान नहीं किया जाता है, तो यह समाप्त होने पर आपको बक्षीस मिलेगा। –

2

चेक बाहर www.sdmsoftware.com/group_policy_scripting। यह मुफ़्त नहीं है लेकिन ठीक वही करेगा जो आप कर रहे हैं।

+0

लिंक के लिए धन्यवाद। दुर्भाग्यवश यह _looks_ महंगा है (आमतौर पर तब होता है जब आपको उद्धरण के लिए बिक्री से संपर्क करना पड़ता है) और शायद इस परियोजना पर मेरी ज़रूरतों के लिए अधिक है। लेकिन आप सही हैं, ऐसा लगता है कि मैंने जो पूछा है :) –

3

नोट: C: मैं दो GroupPolicy विधानसभा संदर्भ का उपयोग \ Windows \ विधानसभा \ GAC_MSIL \ Microsoft .GroupPolicy.Management \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.GroupPolicy.Management.dll और सी: \ विंडोज \ असेंबली \ GAC_32 \ Microsoft.GroupPolicy.Management.Interop \ 2.0.0.0__31bf3856ad364e35 \ Microsoft.Grou pPolicy.Management.Interop.dll यह ढांचा 2.0 है, इसलिए मिश्रित कोड हैं, और आपको 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

मैंने इसे ऐसा बनाया।

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