5

私はWindows8Metroアプリを開発しており、社内の数台のタブレットにのみ展開する予定です。Windowsストア向けではありません。

会社のネットワーク共有上のいくつかのディレクトリにアクセスするにはアプリが必要ですが、ユーザーにを使用させるFilePickerことは私たちが望んでいることではありません。

私たちの最初の試みはを使用することでしたawait StorageFolder.GetFolderFromPathAsync("J:\\");。これは機能せず、次の例外が発生しました。

タイプ'System.UnauthorizedAccessException'の未処理の例外がmscorlib.dllで発生しました

WinRT情報:指定されたファイルまたはフォルダー(J:\)にアクセスできません。アイテムは、アプリケーションがアクセスできる場所にありません(アプリケーションデータフォルダー、機能を介してアクセスできるフォルダー、およびStorageApplicationPermissionsリスト内の永続化されたアイテムを含む)。ファイルがシステム属性または隠しファイル属性でマークされていないことを確認します。

追加情報:アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))

"J:\"そこで、ドライブがマップされたネットワークパスに置き換えてみました。これも機能せず、次の例外が発生しました。

タイプ'System.UnauthorizedAccessException'の未処理の例外がmscorlib.dllで発生しました

WinRT情報:指定されたファイル(\\ domain \ path \ JDrive)にアクセスできません。このタイプのファイルのマニフェストでファイルタイプの関連付けが宣言されていること、およびファイルがシステム属性または隠しファイル属性でマークされていないことを確認してください。

追加情報:アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))

私たちのアプリには次の機能があります。

  • エンタープライズ認証
  • インターネット(クライアント)
  • プライベートネットワーク(クライアントとサーバー)

私たちのアプリには宣言がありません

これはすべてWindowsストアアプリにとって非常に合理的ですが、ストアにアクセスしない単純な社内アプリの回避策はありますか?

4

4 に答える 4

2

JavaScriptVB/C#/C++でのファイルアクセスのクイックスタートは次のとおりです。

さらに、Windowsストアアプリでのファイルアクセスとアクセス許可に関するこの記事が役立つ場合があります。この記事から、適切な機能を使用しているように見えますが、注意事項があります。

注:アプリがこの場所でアクセスできる特定のファイルタイプを宣言するファイルタイプの関連付けをアプリマニフェストに追加する必要があります。

これは、表示されているエラーメッセージで意味があります。やってみてもらえますか?これを行う方法に関する記事は次のとおりです:http://msdn.microsoft.com/en-us/library/windows/apps/hh452684.aspx

また、アクセスしたいファイルがシステムまたは隠しファイルの属性でマークされていないことをすでに確認して確認していることを前提としています(エラーメッセージに従って)。

于 2013-03-07T20:26:17.603 に答える
1

現在、を介してファイル共有にアクセスすることでこれを回避していますWCF Web Service。理想からは程遠いですが、必要なものを手に入れることができます。

于 2013-03-08T18:17:01.070 に答える
1

以下は、Windows 8.1 RTを実行しているWinRTデバイス(Microsoft Surface RT)からネットワーク共有にファイルを書き込むためのコードです。重要な部分は次のとおりです。

  • 共有にはUNCパスを使用してアクセスします
  • シェアは公開されています
  • アプリケーションマニフェストは、書き込まれるファイルタイプに言及します
  • アプリケーションには適切な機能があります

基本的なメカニズムはここで説明されています:http: //msdn.microsoft.com/en-US/library/windows/apps/hh967755.aspx

ボーナスとして、これはWinRTアプリケーションで出力を標準出力にキャプチャする方法を示しています。

コード:

#include "App.xaml.h"
#include "MainPage.xaml.h"
#include <ppltasks.h>

using namespace TestApp;

using namespace Platform;
using namespace Windows::UI::Xaml::Navigation;
using namespace Concurrency;

// Anything that is written to standard output in this function will be saved to a file on a network share
int MAIN(int argc, char** argv)
{
    printf("This is log output that is saved to a file on a network share!\n");
    return 0;
}

static char buffer[1024*1024];

Windows::Foundation::IAsyncOperation<int>^ MainPage::RunAsync()
{
    return create_async([this]()->int {
        return MAIN(1, NULL);
    });
}

using namespace concurrency;
using namespace Platform;
using namespace Windows::Storage;
using namespace Windows::System;

void MainPage::Run()
{
    //capture stdout in buffer
    setvbuf(stdout, buffer, _IOFBF, sizeof(buffer));

    task<int> testTask(RunAsync());

    testTask.then([this](int test_result)
    {
        size_t origsize = strlen(buffer) + 1;
        wchar_t* wcstring = new wchar_t[sizeof(buffer)* sizeof(wchar_t)];

        size_t  converted_chars = 0;
        mbstowcs_s(&converted_chars, wcstring, origsize, buffer, _TRUNCATE);
        String^ contents = ref new Platform::String(wcstring);
        delete [] wcstring;

        Platform::String^ Filename = "log_file.txt";
        Platform::String^ FolderName = "\\\\MY-SHARE\\shared-folder";

        create_task(Windows::Storage::StorageFolder::GetFolderFromPathAsync(FolderName)).then([this, Filename, contents](StorageFolder^ folder)
        {
            create_task(folder->CreateFileAsync(Filename, CreationCollisionOption::ReplaceExisting)).then([this, contents](StorageFile^ file)
            {
                create_task(FileIO::WriteTextAsync(file, contents)).then([this, file, contents](task<void> task)
                {
                    try
                    {
                        task.get();
                        OutputBox->Text = ref new Platform::String(L"File written successfully!");
                    }
                    catch (COMException^ ex)
                    {
                        OutputBox->Text = ref new Platform::String(L"Error writing file!");
                    }
                });
            });
        });
    });
}

MainPage::MainPage()
{
    InitializeComponent();
    Run();
}

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
  <Identity Name="6f9dc943-75a5-4195-8a7f-9268fda4e548" Publisher="CN=Someone" Version="1.1.0.1" />
  <Properties>
    <DisplayName>TestApp</DisplayName>
    <PublisherDisplayName>Someone</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
    <Description>TestApp</Description>
  </Properties>
  <Prerequisites>
    <OSMinVersion>6.3</OSMinVersion>
    <OSMaxVersionTested>6.3</OSMaxVersionTested>
  </Prerequisites>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="TestApp.App">
      <m2:VisualElements DisplayName="TestApp" Description="TestApp" BackgroundColor="#222222" ForegroundText="light" Square150x150Logo="Assets\Logo.png" Square30x30Logo="Assets\SmallLogo.png">
        <m2:DefaultTile>
          <m2:ShowNameOnTiles>
            <m2:ShowOn Tile="square150x150Logo" />
          </m2:ShowNameOnTiles>
        </m2:DefaultTile>
        <m2:SplashScreen Image="Assets\SplashScreen.png" />
      </m2:VisualElements>
      <Extensions>
        <Extension Category="windows.fileTypeAssociation">
          <FileTypeAssociation Name="text">
            <DisplayName>Text file</DisplayName>
            <SupportedFileTypes>
              <FileType ContentType="text/plain">.txt</FileType>
            </SupportedFileTypes>
          </FileTypeAssociation>
        </Extension>
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="musicLibrary" />
    <Capability Name="picturesLibrary" />
    <Capability Name="videosLibrary" />
    <Capability Name="internetClient" />
    <Capability Name="internetClientServer" />
    <Capability Name="enterpriseAuthentication" />
    <Capability Name="privateNetworkClientServer" />
  </Capabilities>
</Package>
于 2014-03-04T12:00:37.293 に答える
0

この質問をご覧ください:WinRTでのネットワーク共有パスへのアクセス

Win8アプリで共有の場所にアクセスする方法はありません。

于 2013-04-15T06:03:00.487 に答える