> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/commander-sdk/keeper-commander-sdks/sdk-command-reference/sharing-commands/shared-folder-commands.md).

# 共有フォルダコマンド

共有フォルダ一覧およびレコード権限変更コマンドの説明

## 概要

共有フォルダの一覧、チーム、ならびにレコード権限の変更に関するコマンドを整理し、詳細を記載しています。

1. [共有フォルダ一覧コマンド](#list-share-folder)
2. [共有フォルダコマンド](#share-folder-command)
3. [共有フォルダ - レコード権限の変更コマンド](#share-folder-change-record-permissions-command)

## コマンド

### 共有フォルダ一覧コマンド <a href="#list-share-folder" id="list-share-folder"></a>

指定したフォルダ内、またはKeeperボルトの現在のディレクトリにある共有フォルダを一覧表示します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `sf-list`

**例:**

```bash
My Vault> sf-list
  #  Shared Folder UID       Name                             # Records  # Users
---  ----------------------  -------------------------------  ---------  -------
  1  shared_folder_uid       Test-Shared-Folder                11         1      
```

</details>

<details>

<summary>DotNet SDK</summary>

**関数:**

```csharp
var sharedFolders = vault.SharedFolders;
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Get-KeeperSharedFolder`

**フラグ:**

* `-Uid` : 共有フォルダのUID
* `-Filter` : 共有フォルダを絞り込むために使用する

**例:**

```powershell
PS> Get-KeeperSharedFolder

Uid                    Name                            DefaultManageRecords DefaultManageUsers DefaultCanEdit DefaultCanShare UserCount RecordCount
---                    ----                            -------------------- ------------------ -------------- --------------- --------- -----------
shared_folder_uid      example_new_shared_folder       True                 True               True           True                    1           1
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `list-sf`

**オプション:**

* `pattern` : 共有フォルダのタイトルまたはUIDのパターン
* `-h, --help` : このヘルプを表示して終了する
* `--format` : `list-sf` コマンドの出力形式を指定する。指定できる値は以下のとおり。
  * ***table:*** 表形式で出力する。既定では表形式
    * 例: `--format table`
  * ***csv:*** CSV形式で出力する
    * 例: `--format csv`
  * ***json*****&#x20;:** JSON形式で出力する
    * 例: `--format json`
* `--output` : 出力をファイルに保存する。出力形式が table (`--format table`) のときは使用しない
  * 例: `--output <file_name>`
* `--verbose, -v` : 詳細出力

**例:**

```
My Vault> list-sf
  #  Shared Folder UID       Name
---  ----------------------  -----------------------------------------
  1  shared_folder_uid       Test Example Folder
```

</details>

<details>

<summary>Python SDK</summary>

**関数:** `find_shared_folders`

```python
find_shared_folders(self, criteria: str) -> Iterable[vault_types.SharedFolderInfo]
```

**例:**

```python
shared_folders = vault.vault_data.find_shared_folders(criteria=pattern)
```

</details>

### 共有フォルダコマンド <a href="#share-folder-command" id="share-folder-command"></a>

従来型の共有フォルダの共有権限を変更します。ユーザー、チーム、レコードへのアクセスを許可または削除する際に使用します。

**備考:**

* 従来型の共有フォルダにのみ対応。NSFやKeeper Driveの階層型フォルダには対応していません
* 招待: ユーザーがKeeperアカウントを持っていない場合、SDKが招待を送信します。相手が招待を承諾したら、再度共有してください
* チャンク処理: CLIは大量のユーザー・レコードを1バッチあたり `999` 件ずつに分割します。SDKの `send_requests` 呼び出しも、APIコール1回あたり `999` リクエストずつに分割します

<details>

<summary>Python CLI</summary>

**コマンド:** `share-folder [options] <folder> [<folder> ...]`

**別名:** `sf`

**位置パラメータ:**

* `folder`: 必須。1件以上の共有フォルダのパス、名前、またはUIDを指定します。`*` を指定すると、ボルト内のすべての共有フォルダが対象になります

**アクション:**

* `-a`, `--action`: `grant` または `remove`。既定は `grant`
  * `grant`: アクセスを追加または更新します
  * `remove`: ユーザー、チーム、またはレコードのアクセスを取り消します

**ユーザーとチーム:**

* `-e`, `--email`: 繰り返し指定可。以下を指定できます:
  * `user@example.com`: ユーザーへのアクセスを許可または取り消します
  * `<team_name>` または `<team_uid>`: チームへのアクセスを許可または取り消します
  * `@existing` または `@current`: フォルダに既に存在するすべてのユーザーとチームを対象にします
  * `*`: フォルダの既定のアカウント権限を更新します

**レコード:**

* `-r`, `--record`: 繰り返し指定可。以下を指定できます:
  * レコードのタイトルまたはUID
  * `@existing` または `@current`: フォルダ内のすべてのレコードを対象にします
  * `*`: 既定のレコード権限を更新します

**アカウント権限:**

* `-p`, `--manage-records`: `on` または `off`。ユーザーまたはチームがフォルダ内のレコードを追加・削除・編集できるようにします
* `-o`, `--manage-users`: `on` または `off`。ユーザーまたはチームが他のユーザーやチームを追加・削除できるようにします

**レコード権限:**

* `-d`, `--can-edit`: `on` または `off`。共有レコードの編集を許可します
* `-s`, `--can-share`: `on` または `off`。共有レコードの再共有を許可します

**有効期限:**

* `--expire-at`: `never`、または `yyyy-MM-dd` か `yyyy-MM-dd hh:mm:ss` 形式のISO日時
* `--expire-in`: `never`、または `<N>[(y)ears|(mo)nths|(d)ays|(h)ours|(mi)nutes]`
* 有効期限は `--action grant` の場合にのみ適用されます
* 省略した場合、共有に有効期限は設定されません

**失効時のローテーション:**

* `-roe`, `--rotate-on-expiration`: 共有アクセスが失効した時点で `pamUser` のパスワードをローテーションします

**その他:**

* `-f`, `--force`: コマンドには定義されていますが、初回共有時に既定のフォルダ権限を無視するためのもので、現行のSDK CLI実行ロジックには組み込まれていません

**例:**

```sh
share-folder -e user@example.com -a grant "My Shared Folder"
share-folder -e user@example.com -d on -s off -a grant IQ_folderUid
share-folder -e "Dev Team" -p on -o off -a grant IQ_folderUid
share-folder -e user@example.com -r "Server Login" -r IQ_recordUid -a grant IQ_folderUid
share-folder -e @existing -p on -a grant IQ_folderUid
share-folder -e '*' -p on -o off -r '*' -d on -s off -a grant IQ_folderUid
share-folder -e user@example.com --expire-in 7d -a grant IQ_folderUid
share-folder -e contractor@example.com --expire-in 7d -roe -a grant IQ_folderUid
share-folder -e user@example.com -a remove IQ_folderUid
share-folder -e user@example.com -r IQ_recordUid -a remove IQ_folderUid
share-folder -e user@example.com -a grant '*'
```

</details>

<details>

<summary>Python SDK</summary>

**例:**

```python
import sqlite3

from keepersdk.vault import (
    sqlite_storage,
    vault_online,
    shares_management,
    share_management_utils,
)


def build_shared_folder_info(vault, shared_folder_uid: str) -> dict:
    sh_fol = vault.vault_data.load_shared_folder(shared_folder_uid)
    if not sh_fol:
        raise ValueError(f'Shared folder not found: {shared_folder_uid}')

    sf_entity = vault.vault_data.storage.shared_folders.get_entity(shared_folder_uid)
    sf_key = vault.vault_data.get_shared_folder_key(shared_folder_uid=shared_folder_uid)
    if not sf_key:
        raise ValueError(f'Could not resolve shared folder key: {shared_folder_uid}')

    return {
        'shared_folder_uid': shared_folder_uid,
        'users': sh_fol.user_permissions,
        'teams': [],
        'records': [{'record_uid': r.record_uid} for r in sh_fol.record_permissions],
        'shared_folder_key_unencrypted': sf_key,
        'default_manage_users': sh_fol.default_manage_users,
        'default_manage_records': sh_fol.default_manage_records,
        'revision': sf_entity.revision if sf_entity else 0,
    }


def share_folder(
    keeper_auth_context,
    *,
    shared_folder_uid: str,
    users: list[str] | None = None,
    teams: list[str] | None = None,
    record_uids: list[str] | None = None,
    action: str = 'grant',              # -a grant|remove
    manage_records: str | None = 'on',    # -p on|off
    manage_users: str | None = 'off',     # -o on|off
    can_edit: str | None = 'on',          # -d on|off
    can_share: str | None = 'off',        # -s on|off
    default_account: bool = False,        # -e '*'
    default_record: bool = False,         # -r '*'
    expire_at: str | None = None,         # --expire-at
    expire_in: str | None = '7d',         # --expire-in
    rotate_on_expiration: bool = False,   # -roe
):
    """
    keepercliのshare-folderコマンドに相当するSDK処理です。

    CLIの例:
      share-folder -e user@example.com -p on -o off -d on -s off \
        --expire-in 7d -roe -a grant IQ_folderUid
    """
    conn = sqlite3.Connection('file::memory:', uri=True)
    vault_storage = sqlite_storage.SqliteVaultStorage(
        lambda: conn,
        vault_owner=bytes(keeper_auth_context.auth_context.username, 'utf-8'),
    )
    vault = vault_online.VaultOnline(keeper_auth_context, vault_storage)
    vault.sync_down()

    try:
        share_expiration = None
        if action == shares_management.ShareAction.GRANT.value:
            share_expiration = share_management_utils.get_share_expiration(
                expire_at=expire_at,
                expire_in=expire_in,
            )

        if rotate_on_expiration:
            share_management_utils.validate_rotate_on_expiration(
                share_expiration, rotate_on_expiration
            )
            if action != shares_management.ShareAction.GRANT.value:
                raise share_management_utils.ShareValidationError(
                    '--rotate-on-expiration is only valid with --action grant'
                )
            share_management_utils.validate_folder_shares_rotate_on_expiration(
                vault, [shared_folder_uid], rotate_on_expiration
            )

        sf_info = build_shared_folder_info(vault, shared_folder_uid)

        request = shares_management.FolderShares.prepare_request(
            vault=vault,
            kwargs={
                'action': action,
                'manage_records': manage_records,
                'manage_users': manage_users,
                'can_edit': can_edit,
                'can_share': can_share,
            },
            curr_sf=sf_info,
            users=users or [],
            teams=teams or [],
            rec_uids=record_uids or [],
            default_record=default_record,
            default_account=default_account,
            share_expiration=share_expiration,
            rotate_on_expiration=rotate_on_expiration,
        )

        success, failed = shares_management.FolderShares.send_requests(vault, [[request]])
        print('Success:', success)
        print('Failed:', failed)
        vault.sync_down()
        return success, failed

    except share_management_utils.ShareValidationError as err:
        print(f'Validation error: {err}')
        raise
    finally:
        vault.close()
        keeper_auth_context.close()


# --- 使用例 ---

# 基本的な許可
# share_folder(auth, shared_folder_uid='IQ_...', users=['user@example.com'])

# ROE付きで許可
# share_folder(
#     auth,
#     shared_folder_uid='IQ_...',
#     users=['contractor@example.com'],
#     expire_in='7d',
#     rotate_on_expiration=True,
# )

# チーム + 特定レコードへの許可
# share_folder(
#     auth,
#     shared_folder_uid='IQ_...',
#     teams=['IQ_teamUid'],
#     record_uids=['IQ_recordUid1', 'IQ_recordUid2'],
#     manage_records='on',
#     can_edit='on',
#     can_share='off',
# )

# ユーザーを削除
# share_folder(
#     auth,
#     shared_folder_uid='IQ_...',
#     users=['user@example.com'],
#     action='remove',
# )

# 既定のフォルダ権限を設定 (-e '*' -r '*')
# share_folder(
#     auth,
#     shared_folder_uid='IQ_...',
#     default_account=True,
#     default_record=True,
#     manage_records='on',
#     manage_users='off',
#     can_edit='on',
#     can_share='off',
# )
```

</details>

<details>

<summary>JavaScript SDK</summary>

**関数:** `listSharedFolders`

```python
function listSharedFolders(
    storage: InMemoryStorage,
    options: ListSharedFoldersOptions = {}
): ListSharedFolderRow[] {
    const { pattern, includeDetails = false } = options
    const sharedFolders: DSharedFolder[] = pattern
        ? findSharedFolders(storage, pattern)
        : storage.getAll<DSharedFolder>(FolderKind.SharedFolder)
    return sharedFolders.map((sharedFolder) => {
        const shared_folder_uid = sharedFolder.uid
        const name = sharedFolderDisplayName(sharedFolder)
        const row: ListSharedFolderRow = { shared_folder_uid, name }
        if (includeDetails) {
            row.record_count = countRecordsForFolder(storage, shared_folder_uid)
            row.user_count = countUsersForFolder(storage, shared_folder_uid)
            row.team_count = countTeamsForFolder(storage, shared_folder_uid)
            row.default_manage_records = sharedFolder.defaultManageRecords
            row.default_manage_users = sharedFolder.defaultManageUsers
            row.default_can_edit = sharedFolder.defaultCanEdit
            row.default_can_share = sharedFolder.defaultCanShare
        }
        return row
    })
}
```

</details>

### 共有フォルダ - レコード権限の変更コマンド <a href="#share-folder-change-record-permissions-command" id="share-folder-change-record-permissions-command"></a>

共有フォルダ内のレコード権限を変更します。レコードごとに付与または取り消しが可能です。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `sf-record`

**フラグ:**

* `-r, --record` : 共有フォルダ内で共有の対象とするレコード名またはレコードUID
* `-s, --can-share` : 真偽値 (`true` または `false`)。`true` のとき共有権限あり。`false` のとき共有権限が削除されます
* `-e, --can-edit` : 真偽値 (`true` または `false`)。`true` のとき編集権限あり。`false` のとき編集権限が削除されます
* `--expire-at` : 共有の期限をISO時刻で指定: YYYY-MM-DD HH:flag\_mm:SS
* `--expire-in` : 共有の相対期限: \[N]mi|h|d|mo (分 / 時間 / 日 / 月)
* `--help` : このヘルプ画面を表示する
* `--version` : バージョン情報を表示する
* `folder name (pos. 0)` : 必須の共有フォルダ名 (位置引数 0)

**例:**

```bash
My Vault> sf-record record_uid
  #  Record Title   Record UID              Can Edit  Can Share  Expiration
---  -------------  ----------------------  --------  ---------  ----------
  1  ABC            record_uid              X         X
  2  Gmail Account  record_uid              X         X
  3  Gmail Account  record_uid              X         X

My Vault> sf-record folder_uid --record=record_uid --expire-in=30mi

My Vault> sf-record BRvqCEzmFM9rVqkmpeGs6A
  #  Record Title   Record UID              Can Edit  Can Share  Expiration
---  -------------  ----------------------  --------  ---------  ----------------
  1  ABC            record_uid              X         X          03-11-2025 18:08
  2  Gmail Account  record_uid              X         X
  3  Gmail Account  record_uid              X         X
```

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:** `ChangeRecordInSharedFolder`

```csharp
public async Task ChangeRecordInSharedFolder(string sharedFolderUid, string recordUid, IRecordShareOptions options)
```

**例:**

```csharp
await context.Vault.ChangeRecordInSharedFolder(sf.Uid, recordUid, shareOptions);
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Set-KeeperSharedFolderRecordPermission`

**別名:** `ksfr`

**フラグ:**

* `-SharedFolder` : 共有フォルダのUID、名前、またはUID/名前を含むオブジェクト
* `-Record` : レコードUID、またはレコードUIDを含むオブジェクト
* `-CanEdit` : 共有フォルダのメンバーがレコードを編集できるかどうか。`true`、`false`、`1`、`0` のいずれかを指定します
* `-CanShare` : 共有フォルダのメンバーがレコードを再共有できるかどうか。`true`、`false`、`1`、`0` のいずれかを指定します
* `-ExpireIn` : `30d` や `1h` のように、現在時刻からの相対的な期限を設定します
* `-ExpireAt` : 絶対的な期限日時を設定します
* `-RotateOnExpiration` : 権限が失効したときにレコードのパスワードをローテーションします。期限の設定に加え、`pamUser` ローテーションレコードが構成された共有フォルダが必要です
* `-WhatIf` : 変更を加えずに、権限変更の内容をプレビューします
* `-Confirm` : 権限変更の前に確認を求めます

**例:**

```powershell
PS> Set-KeeperSharedFolderRecordPermission -SharedFolder "shared_folder_uid" -Record "record_uid" -CanEdit false -CanShare true
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `record-permission`

**パラメーター:**

* `-a`, `--action` 付与または取り消し (必須)
* `folder` 変更を適用する共有フォルダのUID (必須)

**オプション:**

* `--dry-run` コミットせずに権限の変更内容を表示する
* `--force` 確認なしで権限変更を適用する
* `-R`, `--recursive` すべてのサブフォルダに権限変更を適用する
* `--share-record` レコードの共有権限を変更する
* `--share-folder` フォルダの共有権限を変更する
* `-s`, `--can-share` レコード権限: 共有可能にする
* `-d`, `--can-edit` レコード権限: 編集可能にする
  * **--can-edit または --can-share のいずれかが必須**
* **例:**

```sh
My Vault> record-permission -a grant --share-record -s -d shared_folder_uid

Request to GRANT "Can Edit" & "Can Share" permission(s) in "my_share" folder only
```

</details>

<details>

<summary>Python SDK</summary>

**関数:**

```python
from keepersdk.vault import share_management_utils
​
result = share_management_utils.update_record_permissions(
            vault=vault,
            action=action,
            can_share=can_share,
            can_edit=can_edit,
            folder_uid_or_path=folder_uid_or_path,
            recursive=recursive,
            share_record=share_record,
            share_folder=share_folder,
            dry_run=dry_run,
            sync_after=sync_after,
        )
```

</details>

### 共有フォルダへのユーザーまたはチームの追加コマンド

指定したアクセス権限で、共有フォルダにユーザーまたはチームを追加します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** **近日公開**

</details>

<details>

<summary>DotNet SDK</summary>

**関数:**

```csharp
    public bool PutUserToSharedFolder(string sharedFolderUid, string userId, UserType userType, IUserShareOptions options = null)
    {
        if (!TryGetFolderByUid(sharedFolderUid, out var f))
        {
            BatchLogger?.Invoke(Severity.Warning, $"Folder UID \"{sharedFolderUid}\" not found");
            return false;
        }

        switch (f.FolderType)
        {
            case FolderType.UserFolder:
                BatchLogger?.Invoke(Severity.Warning, $"Folder UID \"{sharedFolderUid}\" is not a shared folder");
                return false;
            case FolderType.SharedFolderFolder:
                BatchLogger?.Invoke(Severity.Information, $"Folder UID \"{sharedFolderUid}\" is a shared subfolder folder. Selecting a parent shared folder.");
                sharedFolderUid = f.SharedFolderUid;
                if (!TryGetFolderByUid(sharedFolderUid, out f))
                {
                    BatchLogger?.Invoke(Severity.Warning, $"Folder UID \"{sharedFolderUid}\" not found");
                }
                if (f.FolderType != FolderType.SharedFolder)
                {
                    BatchLogger?.Invoke(Severity.Warning, $"Folder UID \"{sharedFolderUid}\" is not a shared folder");
                }
                break;
        }

        SharedFolderMember pendingMembership = null;

        if (_sharedFolderMembership.TryGetValue(sharedFolderUid, out var currentSharedFolder))
        {
            currentSharedFolder.TryGetValue(userId, out pendingMembership);
        }

        if (pendingMembership != null)
        {
            pendingMembership.IsRemove = false;
            pendingMembership.Options = options;
            return true;
        }

        pendingMembership = new SharedFolderMember
        {
            UserId = userId,
            UserType = userType,
            IsRemove = false,
            Options = options,
        };
        if (currentSharedFolder == null)
        {
            currentSharedFolder = new Dictionary<string, SharedFolderMember>();
            _sharedFolderMembership.Add(sharedFolderUid, currentSharedFolder);
        }
        currentSharedFolder.Add(userId, pendingMembership);
        return true;
    }
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Grant-KeeperSharedFolderAccess -SharedFolder <String> [-User <String>] [-Team <String>] [-ManageUsers <Boolean>] [-ManageRecords <Boolean>] [-TransferRecords <Boolean>] [-AllowShareFullVault <Boolean>] [-WhatIf] [-Confirm]`

**フラグ:**

* `-SharedFolder` : アクセスを許可する共有フォルダのUIDまたは名前
* `-User` : アクセスを許可するユーザーのメールアドレスまたはUID。`-User` または `-Team` のいずれかを指定する必要があります
* `-Team` : アクセスを許可するチームのUIDまたは名前。`-User` または `-Team` のいずれかを指定する必要があります
* `-ManageUsers` : 共有フォルダ内のユーザーを管理する権限を付与します
* `-ManageRecords` : 共有フォルダ内のレコードを管理する権限を付与します
* `-TransferRecords` : 共有フォルダ内でレコードの所有権を移管する権限を付与します
* `-AllowShareFullVault` : 共有フォルダ内だけでなく、ボルト全体からレコードを共有する権限を付与します
* `-WhatIf` : 実際には実行せずに、コマンドレット実行時の動作をプレビューします
* `-Confirm` : コマンドレットの実行前に確認を求めます

**例:**

```powershell
PS> Grant-KeeperSharedFolderAccess -SharedFolder "Marketing" -User "john.doe@company.com"

PS> Grant-KeeperSharedFolderAccess -SharedFolder "Finance" -User "jane.smith@company.com" 
    -ManageUsers $true -ManageRecords $true
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** **近日公開**

</details>

<details>

<summary>Python SDK</summary>

**関数:** **近日公開**

</details>

### 共有フォルダからのユーザーまたはチームの削除コマンド

共有フォルダからユーザーまたはチームを削除します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** **近日公開**

</details>

<details>

<summary>DotNet SDK</summary>

**関数:**

```csharp
        public async Task RemoveUserFromSharedFolder(string sharedFolderUid, string userId, UserType userType)
        {
            var sharedFolder = this.GetSharedFolder(sharedFolderUid);
            var perm = sharedFolder.UsersPermissions.FirstOrDefault(x => x.UserType == userType &&
            (string.Equals(x.Uid, userId, StringComparison.InvariantCulture) || string.Equals(x.Name, userId, StringComparison.InvariantCultureIgnoreCase)));

            if (perm == null)
            {
                return;
            }

            var request = new SharedFolderUpdateV3Request
            {
                SharedFolderUid = ByteString.CopyFrom(sharedFolder.Uid.Base64UrlDecode()),
                EncryptedSharedFolderName = ByteString.CopyFrom(CryptoUtils.EncryptAesV1(Encoding.UTF8.GetBytes(sharedFolder.Name), sharedFolder.SharedFolderKey)),
                ForceUpdate = true,

            };
            {
                var ap = this.ResolveSharedFolderAccessPath(Auth.Username, sharedFolderUid, true);
                if (ap != null && ap.UserType == UserType.Team)
                {
                    request.FromTeamUid = ByteString.CopyFrom(perm.Uid.Base64UrlDecode());
                }
            }

            if (userType == UserType.User)
            {
                request.SharedFolderRemoveUser.Add(perm.Name);
            }
            else
            {
                request.SharedFolderRemoveTeam.Add(ByteString.CopyFrom(perm.Uid.Base64UrlDecode()));
            }

            var response = await Auth.ExecuteAuthRest<SharedFolderUpdateV3Request, SharedFolderUpdateV3Response>("vault/shared_folder_update_v3", request);
            foreach (var arr in (new[] { response.SharedFolderRemoveUserStatus }))
            {
                var failed = arr?.FirstOrDefault(x => x.Status != "success");
                if (failed != null)
                {
                    throw new VaultException($"Remove User \"{failed.Username}\" from Shared Folder \"{sharedFolder.Name}\" error: {failed.Status}");
                }
            }

            foreach (var arr in (new[] { response.SharedFolderRemoveTeamStatus }))
            {
                var failed = arr?.FirstOrDefault(x => x.Status != "success");
                if (failed != null)
                {
                    var uid = failed.TeamUid.ToArray().Base64UrlEncode();
                    throw new VaultException($"Remove Team \"{uid}\" from Shared Folder \"{sharedFolder.Name}\" error: {failed.Status}");
                }
            }

            await SyncDown();
        }
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Revoke-KeeperSharedFolderAccess -SharedFolder <String> [-User <String>] [-Team <String>] [-Force] [-WhatIf] [-Confirm]`

**フラグ:**

* `-SharedFolder` : アクセスを許可する共有フォルダのUIDまたは名前
* `-User` : アクセスを許可するユーザーのメールアドレスまたはUID。`-User` または `-Team` のいずれかを指定する必要があります
* `-Team` : アクセスを許可するチームのUIDまたは名前。`-User` または `-Team` のいずれかを指定する必要があります
* `-Force` : 確認プロンプトなしでアクセスを取り消します
* `-WhatIf` : 実際には実行せずに、コマンドレット実行時の動作をプレビューします
* `-Confirm` : コマンドレットの実行前に確認を求めます

**例:**

```powershell
PS> Grant-KeeperSharedFolderAccess -SharedFolder "Marketing" -User "john.doe@company.com"

PS> Grant-KeeperSharedFolderAccess -SharedFolder "Finance" -User "jane.smith@company.com" 
    -ManageUsers $true -ManageRecords $true
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** **近日公開**

</details>

<details>

<summary>Python SDK</summary>

**関数:** **近日公開**

</details>

<details>

<summary>JavaScript SDK</summary>

**関数:** `shareFolder`

```python
function shareFolder(
    auth: Auth,
    storage: InMemoryStorage,
    input: ShareFolderInput
): Promise<ShareFolderResult> {
    const resolved = resolveFolder(storage, input.folder)
    if (!resolved) {
        throw new KeeperSdkError(`Folder "${input.folder}" was not found.`, 'folder_not_found')
    }
    if (resolved.kind === FolderKind.UserFolder) {
        throw new KeeperSdkError(
            `"${resolved.displayName}" is a personal folder. Only shared folders can be shared.`,
            'not_a_shared_folder'
        )
    }
    r
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.keeper.io/keeperpam/jp/commander-sdk/keeper-commander-sdks/sdk-command-reference/sharing-commands/shared-folder-commands.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
