문제

동료 유인원과 수련잎과 외륜!

VS 2008을 사용하여 C#/.NET/WPF에서 Windows 데스크톱 앱을 개발 중입니다.Vista 및 XP 컴퓨터에 설치하고 실행하려면 앱이 필요합니다.저는 앱을 설치하기 위해 Setup/Windows Installer 프로젝트를 진행 중입니다.

내 앱에는 SQLCE 데이터베이스 파일(.sdf) 및 내가 사용 중인 타사 컨트롤과 관련된 일부 기타 데이터베이스 유형 파일에 대한 읽기/수정/쓰기 액세스 권한이 필요합니다.이러한 파일은 PC의 모든 사용자/로그인 간에 공유되어야 하며, 관리자가 되기 위해 필요한 것은 없습니다.물론 이는 파일이 프로그램 자체 설치 디렉토리에 들어갈 수 없다는 것을 의미합니다(Vista가 출시되기 전에는 종종 그랬던 것처럼 그렇습니다!).

나는 해결책이 간단할 것이라고 예상했다. Vista와 XP에는 모두 이 목적을 위한 공유 응용 프로그램 데이터 폴더가 있습니다. (Vista에서는 "\ProgramData", XP에서는 "\Documents and Settings\All Users\Application Data"입니다.) .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 호출은 지정된 PC에서 이러한 폴더에 대한 경로를 찾기 위해 존재합니다. 예 , 예!

하지만 설치 프로젝트에서 공유 애플리케이션 데이터 폴더를 대상으로 지정하는 방법을 알 수 없습니다.

설치 프로젝트는 "Common Files" 폴더를 제공하지만 이는 공유 프로그램 구성 요소(데이터 파일 아님)용으로 일반적으로 "\Program Files" 아래에 있으며 "\Program files"의 다른 폴더와 동일한 보안 제한 사항을 갖습니다. 응, 응!

설치 프로젝트는 "사용자 응용 프로그램 데이터" 폴더를 제공하지만 이는 사용자별 폴더이므로 제가 피하려고 하는 바로 그 폴더입니다. 예, 예!

VS 2008 설치 프로젝트에서 강력한 Windows 버전 방식으로 shared-app-data 폴더에 파일을 추가할 수 있습니까?누구든지 어떻게 말해줄 수 있나요?

도움이 되었습니까?

해결책

나는 다른 출처를 통해 내 질문에 대한 답을 배웠습니다. 예, 예!안타깝게도 내 문제는 해결되지 않았습니다!그게 나를 해결사로 만드는 이유는 무엇입니까?예, 그렇습니다!

VS2008 설치 프로젝트에서 Common Application Data 폴더의 하위 디렉터리에 항목을 넣으려면 다음을 수행하십시오.

  1. 솔루션 탐색기에서 설치 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "보기 -> 파일 시스템"을 선택합니다.

  2. "대상 컴퓨터의 파일 시스템"을 마우스 오른쪽 버튼으로 클릭하고 "특수 폴더 추가 -> 사용자 정의 폴더"를 선택합니다.

  3. 사용자 정의 폴더의 이름을 "공통 응용 프로그램 데이터 폴더"로 바꿉니다. (이것은 결과 폴더에 사용될 이름이 아니라 직접 유지하는 데 도움이됩니다.)

  4. 폴더의 DefaultLocation 속성을 "[CommonAppDataFolder][Manufacturer]\[ProductName]"으로 변경합니다.단일 백슬래시의 이상한 사용을 포함하여 응용 프로그램 폴더의 DefaultLocation 속성과 유사점에 유의하세요.

  5. "속성"이라는 폴더 속성이 있다는 우스꽝스러우면서도 부인할 수 없는 사실에 잠시 놀랐습니다.

  6. 폴더의 속성 속성을 "COMMONAPPDATAFOLDER"로 변경합니다.

"Common Application Data" 폴더에 있는 데이터 파일은 "\ProgramData\Manufacturer\ProductName"(Vista의 경우) 또는 "\Documents and Settings\All Users\Application Data\Manufacturer\ProductName"(XP의 경우)에 복사됩니다. 설치 프로그램이 실행됩니다.

이제 Vista에서는 관리자가 아닌 사람이 여기에 있는 파일에 대한 수정/쓰기 액세스 권한을 얻지 못하는 것으로 나타났습니다.따라서 모든 사용자는 파일을 읽을 수 있지만 "\Program Files"에서도 해당 파일을 읽을 수 있습니다.그렇다면 Common Application Data 폴더의 요점은 무엇일까요?

다른 팁

"ClickOnce 보안 설정 활성화"를 선택하고 "완전 신뢰 응용 프로그램입니다"를 선택하는 대신 설치 프로젝트의 "설치" 섹션에서 사용자 지정 작업을 사용하여 앱의 CommonAppDataDirectory 권한을 변경할 수 있습니다.내가 한 일은 다음과 같습니다.

  1. 설치 중인 앱을 호출하는 사용자 지정 작업을 추가했습니다(또는 별도의 프로그램/dll을 만들어 대신 호출할 수도 있음).
  2. 인수 속성을 "설치"로 설정합니다.
  3. 해당 인수를 확인하기 위해 Program.cs의 Main을 수정했습니다.

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. 프로그래밍 방식으로 권한을 변경하기 위해 SetPermissions 함수를 작성했습니다.

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

설치 프로그램은 관리자 권한으로 실행되므로 프로그램에서 권한을 변경할 수 있습니다."ClickOnce 보안 활성화"로 인해 앱 시작 시 사용자에게 원하지 않는 메시지가 표시될 수 있다는 내용을 어딘가에서 읽었습니다.위와 같이 조치하면 이러한 현상을 방지할 수 있습니다.이것이 누군가에게 도움이 되기를 바랍니다.며칠 전에 이와 같은 것을 보면 도움이 될 수 있다는 것을 알고 있습니다!

저는 이 방법으로 해결했습니다.데이터베이스 파일(.sdf)은 응용 프로그램이 설치된 폴더(응용 프로그램 폴더)와 동일한 폴더에 보관했습니다.기본 프로젝트 속성 창의 보안 탭에서 "ClickOnce 보안 설정 사용"을 선택하고 "완전 신뢰 응용 프로그램입니다"를 선택한 후 다시 빌드하고 설정을 실행했습니다.그 이후에는 보안 문제가 없습니다

Visual Studio 2008과 Windows Vista를 사용하고 있습니다.

이것은 VS2005를 사용하여 나에게 효과적이었지만 DefaultLocation을 변경해야 했고 CommonAppDataFolder를 구분하기 위해 '\'를 추가했습니다.

[CommonAppDataFolder][제조업체][제품명]

이것이 오타인지는 모르겠지만 Lyman은 단일 백슬래시의 이상한 사용을 언급했지만 이는 올바른 것 같지 않습니다.

나는 같은 문제가있었습니다.설치 프로젝트는 사용자에게 "현재 사용자 전용" 또는 "모든 사용자용" 앱을 설치할 수 있는 옵션을 제공합니다.결과적으로 데이터베이스 파일은 현재 사용자 또는 모든 사용자 응용 프로그램 데이터 폴더에 있게 됩니다.설정에서는 애플리케이션이 나중에 데이터베이스에 액세스할 때 해당 정보를 검색할 수 있도록 이 정보를 어딘가에 기록해야 합니다.어떤 애플리케이션 데이터 폴더를 살펴볼지 어떻게 알 수 있나요?

이 문제를 방지하려면 응용 프로그램이 한 사용자용으로 설치되었는지, 모든 사용자용으로 설치되었는지에 관계없이 All Users/Application Data 폴더에 데이터베이스를 설치하려고 합니다.물론 두 명의 사용자가 서로의 데이터를 덮어쓰지 않고는 동일한 컴퓨터에 응용 프로그램을 설치할 수 없다는 것을 알고 있습니다.하지만 이는 매우 희박한 가능성이므로 고려하고 싶지 않습니다.

내가 받은 첫 번째 퍼즐 조각 여기:

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

이제 데이터 소스에 DataDirectory 자리 표시자가 포함되어 있는지 확인해야 합니다.이 작품은 에서 나왔습니다. 여기.DataSet 디자이너에서 DataSet의 속성을 찾아 Connection 노드를 열고 다음과 같이 ConnectionString 속성을 편집합니다.

Data Source=|DataDirectory|\YourDatabase.sdf

그런 다음 Common Application Data Folder를 설치 프로젝트에 추가하고 해당 폴더에 데이터베이스 파일을 배치하는 방법에 대한 위의 Lyman Enders Knowles의 지침을 따랐습니다.

그런 다음 위에서부터 Ove의 제안을 따랐습니다."ClickOnce 보안 설정 활성화"를 선택하고 "완전 신뢰 응용 프로그램입니다."를 선택했습니다.

그 후 응용 프로그램은 Vista에서 제대로 배포되었으며 데이터베이스 파일에 읽기 및 쓰기 모두에 액세스할 수 있었습니다.

나는 아래 개념을 좋아합니다. 위에서 가져온 몇 가지 내용

  1. 솔루션 탐색기에서 설치 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "보기 -> 파일 시스템"을 선택합니다.

  2. "대상 컴퓨터의 파일 시스템"을 마우스 오른쪽 버튼으로 클릭하고 "특수 폴더 추가 -> 사용자 정의 폴더"를 선택합니다.

  3. 사용자 정의 폴더의 이름을 "공통 응용 프로그램 데이터 폴더"로 바꿉니다. (이것은 결과 폴더에 사용될 이름이 아니라 직접 유지하는 데 도움이됩니다.)

  4. 폴더의 DefaultLocation 속성을 "[CommonAppDataFolder][Manufacturer][ProductName]"으로 변경합니다.단일 백슬래시의 이상한 사용을 포함하여 응용 프로그램 폴더의 DefaultLocation 속성과 유사점에 유의하세요.

  5. "Property"라는 폴더 속성이 있다는 말도 안되는 (아직 부인할 수없는) 사실에 잠시 놀랐습니다. 광견병으로 가득 찬 아기, 누가이 똥을 생각해 냅니까?

  6. 폴더의 속성 속성을 "COMMONAPPDATAFOLDER"로 변경합니다.

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

이것이 귀하의 경우에 도움이 될지 확실하지 않습니다.

하지만 앱의 구성 파일에 비공개 섹션을 추가하면

앱에서 확인할 추가 폴더를 지정할 수 있습니다.

당신이 말하는 것은 기계의 다른 폴더에 설치할 수 있기를 원한다면 문제가됩니다.기본적으로 MS 가이 물건을 제한 한 모든 이유는 사용자가 설치하는 내용을 알지 못하는 악의적 인 코드를 유지하는 것입니다.

따라서 다른 디렉토리가 필요한 경우에는 작동하지 않습니다.이 수정 사항은 앱 내에서 파일을 검색 할 위치를 지정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top