> 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/secrets-manager-commands/secrets-manager-share-commands.md).

# シークレットマネージャー共有コマンド

アプリケーションへのシークレット共有および共有解除に関するKeeperシークレットマネージャーコマンドの利用

### 概要

**レコードまたはフォルダ** (シークレット) のうち、Keeperシークレットマネージャーアプリがアクセスできるものを制御します。

* ユーザーは、このコマンドでアプリとシークレットをリンクして共有します。
* アプリに**読み取り専用**または**編集可能**でアクセスさせるかも選択できます。

### 対応コマンド

* [シークレットマネージャー共有コマンド](#secrets-manager-share)
* [シークレットマネージャー共有解除コマンド](#secrets-manager-unshare)

### シークレット共有コマンド

このコマンドは、ボルトのフォルダまたはレコードをKeeperシークレットマネージャーアプリケーションに関連付け、当該シークレットへのアプリのアクセスを付与します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `ksm`

**アクション:** `share`

**フラグ:**

* `--folder` : 共有フォルダのUIDまたは名前。「share」「unshare」のみ
* `-e, --can-edit` : シークレットを編集できるか。「share」「unshare」のみ
* `--help` : このヘルプ画面を表示します。
* `--version` : バージョン情報を表示します。
* `value pos. 0` : KSMコマンド: "view", "create", "delete", "share", "unshare", "add-client",\
  "delete-client", "list", "app-share", "app-unshare"
* `value pos. 1` : シークレットマネージャーアプリケーションのUIDまたはタイトル

**例:**

```bash
My Vault > ksm share ksm_app_uid --folder folder_uid
  Application UID: ksm_app_uid
               Title: Test_Example Application

Shares
  #  Share Type    Share UID               Share Title                    Editable  Created           
---  ------------  ----------------------  -----------------------------  --------  ------------------
  1  SharedFolder  ksm_app_uid             Example Resources                 X         5/2/2025 9:53 AM

Devices
  #  Name                  Device ID  Created             Last Accessed     
---  --------------------  ---------  ------------------  ------------------
  1  Example Application    4xeebo     5/2/2025 9:53 AM    7/8/2025 10:56 AM  
```

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:** `ShareToSecretManagerApplication`

```csharp
 Task<SecretsManagerApplication> ShareToSecretManagerApplication(string applicationId,
            string sharedFolderOrRecordUid, bool canEdit);
```

**引数:**

`applicationId` - フォルダまたはレコードを共有する先のKSMアプリケーションのIDです。

`sharedFolderOrRecordUid` - レコードまたは共有フォルダのIDです。

`canEdit` - 編集権限を付与するかどうかを示すブール値です。

</details>

<details>

<summary>PowerCommander</summary>

**コマンド:** `Grant-KeeperSecretsManagerFolderAccess`

**エイリアス :** `ksm-share`

**フラグ:**

* `-App` : アプリケーションのUID
* `-Secret` : シークレット/レコード/フォルダのUID

**例:**

```powershell
PS > Grant-KeeperSecretManagerFolderAccess -App ksm_app_uid  -Secret record_uid   

Uid                    Title                    IsExternalShare DeviceCount ShareCount
---                    -----                    --------------- ----------- ----------
ksm_app_uid            Example Application         False           7           6
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド**: `secrets-manager-share --command=<add/remove/update>`

**パラメーター**:

* `--command` 追加、削除、または更新
* `-a` `--app` アプリケーション名またはUID
* `-s` `--secret` レコードUID（スペース区切り。例: "uid1 uid2 uid3"）

**オプション**:

* `-e` `--editable` 編集可能な共有として許可する
* `--readonly` 共有を読み取り専用に設定する

**例:**

```sh
secrets-manager-share --command add --app "My KSM App" --secret "IQ_uid1 IQ_uid2" --editable
```

```sh
secrets-manager-share --command remove --app "My KSM App" --secret "IQ_uid1 IQ_uid2"
```

```sh
secrets-manager-share --command update --app "My KSM App" --secret "IQ_uid1" --readonly
```

</details>

<details>

<summary>Python SDK</summary>

**関数マップ:**

* 追加: `ksm_management.KSMShareManagement.add_secrets_to_ksm_app()`
* 削除: `ksm_management.KSMShareManagement.remove_secrets_from_ksm_app()`
* 更新: `ksm_management.update_secrets_manager_app_shares()`

**例:**

```python
import sqlite3
from typing import List, Optional, Tuple

from keepersdk import errors
from keepersdk.authentication import keeper_auth
from keepersdk.enterprise import enterprise_data as enterprise_data_types
from keepersdk.vault import sqlite_storage, vault_online, ksm_management


def open_vault(keeper_auth_context: keeper_auth.KeeperAuth) -> vault_online.VaultOnline:
    """ボルトを作成して同期し、VaultOnlineを返します。"""
    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()
    return vault


def resolve_app_uid(vault: vault_online.VaultOnline, app_uid_or_name: str) -> str:
    """UIDまたはアプリケーション名からKSMアプリのUIDを解決します。"""
    app = ksm_management.get_secrets_manager_app(vault, app_uid_or_name)
    return app.uid


def get_app_master_key(vault: vault_online.VaultOnline, app_uid: str) -> bytes:
    """KSMアプリケーションの復号済みレコードキーを取得します。"""
    master_key = vault.vault_data.get_record_key(app_uid)
    if not master_key:
        raise ValueError(f'Could not resolve record key for application {app_uid}')
    return master_key


# ---------------------------------------------------------------------------
# ADD: レコードまたは共有フォルダをKSMアプリに共有
# CLI: secrets-manager-share --command add --app ... --secret "uid1 uid2" [--editable]
# ---------------------------------------------------------------------------
def add_secrets_to_ksm_app(
    vault: vault_online.VaultOnline,
    app_uid_or_name: str,
    secret_uids: List[str],
    *,
    is_editable: bool = False,
    enterprise: Optional[enterprise_data_types.EnterpriseData] = None,
) -> List[Tuple[str, str]]:
    """
    KSMアプリケーションにシークレットを追加します。

    引数:
        vault: 同期済みのVaultOnlineインスタンス
        app_uid_or_name: KSMアプリの名前またはUID
        secret_uids: 共有するレコードまたは共有フォルダのUID
        is_editable: TrueならKSMクライアントから編集可能、Falseなら読み取り専用 (既定)
        enterprise: エンタープライズデータ (共有アイテムのユーザー権限を更新するために使用)。
                    KSM共有追加のAPI呼び出しのみが必要な場合はNoneを指定

    戻り値:
        追加に成功したシークレットの (secret_uid, secret_type) タプルのリスト
    """
    app_uid = resolve_app_uid(vault, app_uid_or_name)
    master_key = get_app_master_key(vault, app_uid)

    # KSMアプリ共有APIでシークレットを共有します。内部でsync_down()を実行
    added = ksm_management.KSMShareManagement.add_secrets_to_ksm_app(
        vault=vault,
        enterprise=enterprise,
        app_uid=app_uid,
        master_key=master_key,
        secret_uids=secret_uids,
        is_editable=is_editable,
    )

    perm = 'editable' if is_editable else 'read-only'
    print(f'Added {len(added)} secret(s) to app {app_uid} ({perm}):')
    for secret_uid, secret_type in added:
        print(f'  {secret_uid}\t{secret_type}')
    return added


# ---------------------------------------------------------------------------
# REMOVE: KSMアプリからの既存の共有を削除
# CLI: secrets-manager-share --command remove --app ... --secret "uid1 uid2"
# ---------------------------------------------------------------------------
def remove_secrets_from_ksm_app(
    vault: vault_online.VaultOnline,
    app_uid_or_name: str,
    secret_uids: List[str],
) -> List[str]:
    """
    KSMアプリケーションと既に共有されているシークレットを削除します。

    戻り値:
        実際に削除されたUIDのリスト
    """
    if not secret_uids:
        raise ValueError('At least one secret UID is required')

    app_uid = resolve_app_uid(vault, app_uid_or_name)

    # 任意: UIDが現在共有されているかを検証 (CLIと同じ挙動)
    app_infos = ksm_management.get_app_info(vault, app_uid)
    if not app_infos:
        raise ValueError(f'Could not retrieve application info for UID: {app_uid}')

    current_shared = {
        share.secretUid if isinstance(share.secretUid, str)
        else __import__('keepersdk.utils', fromlist=['utils']).utils.base64_url_encode(share.secretUid)
        for share in getattr(app_infos[0], 'shares', [])
    }
    # UIDをbase64-url形式に正規化
    from keepersdk import utils
    current_shared = {
        uid if len(uid) == 22 else utils.base64_url_encode(uid)
        for uid in current_shared
    }

    valid_uids = [uid for uid in secret_uids if uid in current_shared]
    invalid_uids = [uid for uid in secret_uids if uid not in current_shared]

    for uid in invalid_uids:
        print(f'Warning: {uid} is not shared with this application; skipping.')

    if not valid_uids:
        print('No valid secrets to remove.')
        return []

    ksm_management.KSMShareManagement.remove_secrets_from_ksm_app(
        vault, app_uid, valid_uids
    )
    vault.sync_down()  # removeのAPIは自動的に同期されません

    print(f'Removed {len(valid_uids)} secret(s) from app {app_uid}:')
    for uid in valid_uids:
        print(f'  {uid}')
    return valid_uids


# ---------------------------------------------------------------------------
# UPDATE: アプリに既に共有されているシークレットの編集可能/読み取り専用を変更
# CLI: secrets-manager-share --command update --app ... --secret "uid1" --editable|--readonly
# ---------------------------------------------------------------------------
def update_secrets_manager_app_shares(
    vault: vault_online.VaultOnline,
    app_uid_or_name: str,
    secret_uids: List[str],
    *,
    is_editable: bool,
) -> List[str]:
    """
    KSMアプリに既に登録されているシークレットの共有権限を更新します (削除して再追加)。

    戻り値:
        実際に更新されたUIDのリスト
    """
    updated_uids = ksm_management.update_secrets_manager_app_shares(
        vault=vault,
        uid_or_name=app_uid_or_name,
        secret_uids=secret_uids,
        is_editable=is_editable,
    )

    if updated_uids:
        perm = 'editable' if is_editable else 'read-only'
        print(f'Updated share permissions to {perm}:')
        for uid in updated_uids:
            print(f'  {uid}')
    else:
        print('No shares were updated (may already match, or not shared with app).')

    return updated_uids


# ---------------------------------------------------------------------------
# 使用例
# ---------------------------------------------------------------------------
def main():
    keeper_auth_context = ...  # ログインフローから取得
    enterprise_data = ...      # addでは任意。エンタープライズ管理者の場合はEnterpriseData

    vault = open_vault(keeper_auth_context)

    app_uid_or_name = 'My KSM App'
    secret_uids = ['IQ_recordUid1', 'IQ_recordUid2', 'IQ_sharedFolderUid3']

    try:
        # 1) アプリにシークレットを追加 (既定は読み取り専用。編集可能にする場合はis_editable=Trueを指定)
        add_secrets_to_ksm_app(
            vault,
            app_uid_or_name,
            secret_uids,
            is_editable=False,
            enterprise=enterprise_data,
        )

        # 2) 権限を編集可能に更新
        update_secrets_manager_app_shares(
            vault,
            app_uid_or_name,
            secret_uids=['IQ_recordUid1'],
            is_editable=True,
        )

        # 3) 権限を読み取り専用に更新
        update_secrets_manager_app_shares(
            vault,
            app_uid_or_name,
            secret_uids=['IQ_recordUid1'],
            is_editable=False,
        )

        # 4) アプリからシークレットを削除
        remove_secrets_from_ksm_app(
            vault,
            app_uid_or_name,
            secret_uids=['IQ_recordUid2'],
        )

    except ValueError as e:
        print(f'Validation error: {e}')
    except errors.KeeperApiError as e:
        print(f'API error ({e.result_code}): {e.message}')
    except Exception as e:
        print(f'Error: {e}')
    finally:
        vault.close()
        keeper_auth_context.close()


if __name__ == '__main__':
    main()
```

</details>

### シークレット共有解除コマンド

このコマンドは、以前に共有したフォルダまたはレコードをKeeperシークレットマネージャーアプリケーションから外し、そのシークレットへのアクセスを取り消します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `ksm`

**アクション:** `unshare`

**フラグ:**

* `--folder` : 共有フォルダのUIDまたは名前。「share」「unshare」のみ
* `-e, --can-edit` : シークレットを編集できるか。「share」「unshare」のみ
* `value pos. 1` : シークレットマネージャーアプリケーションのUIDまたはタイトル

**例:**

```bash
My Vault > ksm unshare ksm_app_uid --folder folder_uid
  Application UID: ksm_app_uid
               Title: Test_Example Application

Shares
  #  Share Type    Share UID               Share Title                    Editable  Created           
---  ------------  ----------------------  -----------------------------  --------  ------------------

Devices
  #  Name                  Device ID  Created             Last Accessed     
---  --------------------  ---------  ------------------  ------------------
  1  Example Application    4xeebo     5/2/2025 9:53 AM    7/8/2025 10:56 AM    
```

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:** `UnshareFromSecretManagerApplication`

```csharp
Task<SecretsManagerApplication> UnshareFromSecretManagerApplication(string applicationId,
            string sharedFolderOrRecordUid);
```

**引数:**

`applicationId` - フォルダまたはレコードの共有を解除する先のKSMアプリケーションのIDです。

`sharedFolderOrRecordUid` - 権限を取り消すレコードまたは共有フォルダのIDです。

</details>

<details>

<summary>PowerCommander</summary>

**コマンド**: `Revoke-KeeperSecretManagerFolderAccess`

**エイリアス:** `ksm-unshare`

**フラグ**:

* `-App` : アプリケーションのUID
* `-Secret` : シークレット/レコード/フォルダのUID

**例:**

```powershell
PS > Revoke-KeeperSecretManagerFolderAccess -App ksm_app_uid  -Secret record_uid 

Uid                    Title                    IsExternalShare DeviceCount ShareCount
---                    -----                    --------------- ----------- ----------
ksm_app_uid            Example Application         False           7           5
```

</details>

<details>

<summary>Python CLI</summary>

**コマンド**: `secrets-manager-share --command=<add/remove>`

**パラメーター**:

* `--command` 追加または削除
* `-a` `--app` アプリケーション名またはUID
* `-s` `--secret` レコードUID（スペース区切り。例: "uid1 uid2 uid3"）

**例:**

```sh
My Vault> secrets-manager-share --command='remove' -a='ksm_uid' -s='record_uid'
Shared secrets were successfully removed from the application
```

</details>

<details>

<summary>Python SDK</summary>

**関数:**

```python
ksm_management.KSMShareManagement.remove_secrets_from_ksm_app(
    vault=vault,
    app_uid=app_uid,
    secret_uids=secret_uids,
)
```

</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/secrets-manager-commands/secrets-manager-share-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.
