Безопасные места хранения для любого пользователя, C #, Windows - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть приложение для нашей компании, которое должно хранить настройки глобальным образом, чтобы сотрудники с множеством типов доступа могли запускать программу.

Большинство наших сотрудников получают доступ к программе с помощью учетной записи Public, что означает, что им не нужно входить в систему - есть идентификатор для входа в систему Public, который может использовать каждый. Публичный аккаунт, как вы можете догадаться, строго ограничен!

В результате я не могу найти способ заставить мое приложение записывать данные на ПК. Ошибка всегда одно и то же исключение неавторизованного доступа.

Я пытался использовать следующие пути, которые все терпят неудачу:

  • C: \ ProgSuite \
  • Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)
  • Environment.GetFolderPath (Environment.SpecialFolder.CommonApplicationData)

Я не хочу использовать изолированное хранилище, потому что мне не нужно настраивать приложение для каждого отдельного пользователя, который входит в систему на одном из многих компьютеров нашего завода.

Есть ли способ сказать: «Эй, мое приложение является администратором. Дайте мне доступ!» ???

В настоящее время мы ограничены .NET Framework 3.5.

Редактировать :

Сообщение об исключении:

System.UnauthorizedAccessException: Access to the path 'C:\Documents and Settings\All Users\Application Data\Aaon Coil Products, Inc\AcpConfig.log' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at Suite.MdiForm.SaveFormSettings()
   at Suite.MdiForm.MdiForm_Closing(Object sender, FormClosingEventArgs e)
   at System.Windows.Forms.Form.OnFormClosing(FormClosingEventArgs e)
   at System.Windows.Forms.Form.WmClose(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3603 (GDR.050727-3600)
    CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
Suite
    Assembly Version: 2.2.8.28978
    Win32 Version: 2.2.8
    CodeBase: file:///C:/Program%20Files/Aaon%20Coil%20Products,%20Inc/ACP%20Software%20Suite/Suite.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Core
    Assembly Version: 3.5.0.0
    Win32 Version: 3.5.30729.1 built by: SP
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Management
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Management/2.0.0.0__b03f5f7f11d50a3a/System.Management.dll
----------------------------------------
System.Data
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3082 (QFE.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.DirectoryServices
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.DirectoryServices/2.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll
----------------------------------------
System.Configuration
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Transactions
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
AcpSuiteFormHeader
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0
    CodeBase: file:///C:/Program%20Files/Aaon%20Coil%20Products,%20Inc/ACP%20Software%20Suite/AcpSuiteFormHeader.DLL
----------------------------------------

Ответы [ 4 ]

2 голосов
/ 14 сентября 2010

Я знаю, что вы сказали, что не хотите использовать IsolatedStorage, потому что не хотите, чтобы у каждого пользователя были свои настройки.

Но смотрели ли вы на IsolatedStorage с помощью MachineStore?Если я правильно понимаю (и могу ошибаться, но не в первый раз), это должно быть доступно всем пользователям, обращающимся к вашему приложению.

using(IsolatedStorageFile store = IsolatedStorageFile.GetMachineStoreForApplication())
{
    // check if file exists or not
    try
    {
        using(IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(STG_FILE_NAME, FileMode.OpenOrCreate, store)) {
            StreamWriter sw = new StreamWriter(isfs);
            foreach(string key in m_values.Keys) {
                sw.WriteLine(key + "::" + m_values[key]);
            } // foreach
            sw.Flush();
        } // using
    } catch(IOException) {
        // generally because file is locked by another process...do nothing
    }
} // using

В качестве альтернативы вы можете изменить разрешения файла конфигурации вашего приложения наразрешить всем доступ.Это может сделать привилегированный пользователь при первом запуске приложения.

http://www.techtalkz.com/c-c-sharp/153732-saving-files-so-any-user-can-access-them.html

FileInfo fileInfo = new FileInfo(path);
FileSecurity fileSecurity = fileInfo.GetAccessControl();
fileSecurity.AddAccessRule(new FileSystemAccessRule(
    "Users",
    FileSystemRights.FullControl,
    AccessControlType.Allow) );

fileInfo.SetAccessControl(fileSecurity);
1 голос
/ 14 сентября 2010

Хорошо, вот мои два цента, надеюсь, это поможет вам.

Если вы можете жестко закодировать некоторые учетные данные уровня администратора в своей программе, вы можете использовать олицетворение для той части кода, которой требуется доступ к папкам. Посмотрите здесь:

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

Лично я предпочел бы хранение в ApplicationData.

1 голос
/ 14 сентября 2010

Я использую CommonApplicationData, и, похоже, он отлично работает с одним предупреждением.Я обнаружил, что если администратор создает подкаталог в пути CommonApplicationData, то другие пользователи, не являющиеся администраторами, не могут удалить этот каталог.Вам может понадобиться добавить FileSystemAccessRule к объекту DirectoryInfo при создании подкаталога, содержащегося в CommonApplicationData.Перегрузка метода create позволяет указывать объект этого типа.

Редактировать: с фрагментом кода.

public static void CreateWithEveryoneFullControlIfAdmin(this DirectoryInfo source)
{
    if (IsAdmin())
    {
        DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
        FileSystemAccessRule accessRule
            = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl,
                InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
                PropagationFlags.None,
                AccessControlType.Allow);

        bool modified = false;
        directorySecurity.ModifyAccessRule(AccessControlModification.Add,
            accessRule,
            out modified);

        if (modified)
        {
            source.Create(directorySecurity);
        }
        else
        {
            source.Create();
        }
    }
    else
    {
        source.Create();
    }
}

public static bool IsAdmin()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
1 голос
/ 14 сентября 2010

Вы должны иметь возможность писать в любую папку, чьи права доступа разрешены всем. Вы можете установить эти разрешения внутри вашего установщика или даже вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...